質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

6667閲覧

javaでテキストファイルの特定の一行だけを読み取るには

Myyuu3

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2018/01/24 06:57

編集2018/01/24 09:24

javaでテキストファイルの特定の一行だけを読み取るにはどうしたらいいですか

import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;

class sampre_proguramu{
public static void main(String args[]){
try{
File file=new File("C:\Program Files (x86)\Java\sampretext.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String str=null;
for(int i=0; i<3; i++){
str=br.readLine();
if(i!=3){
str=null;
}

} System.out.println(str); br.close(); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); } }

}

3行目の値を出力したいのですが、このプログラムだと処理が終わった後に出力される値がnullになってしまいます。これはどのように解決したらいいのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2018/01/24 07:02

特定の一行がでるまで、読み飛ばすじゃダメですか?ファイルの読み込み方法がわからない?もう少し何ができて、何ができないか追記してください。
Myyuu3

2018/01/24 07:33

ファイルを読み込むまでは出来ますがそこからどのようにプログラムを組んだらいいのかが分かりません
unz.hori

2018/01/24 09:45

ファイルをオープンして、1行単位で取得し特定のワードなどでマッチングして合致したら標準出力に出力するようにすれば良いと思います。文字列でのマッチング(比較)は"java 文字列比較 パターン"などでググればいいと思います。1行単位の取得についても"java ファイル読み込み 行単位"などでググれば参考になるコードが見つかると思います。検索スキルは今後も必要になると思いますので頑張ってください。
guest

回答4

0

ベストアンサー

こんな感じでどうです(4パターン)?

java

1public class Main { 2 public static void main(String[] args) throws IOException { 3 if (args.length < 2) { 4 System.err.println("Argument is too short."); 5 return; 6 } 7 String line_result = null; 8 Path path = Paths.get(args[0]); 9 int line_number = Integer.parseInt(args[1]); 10 11 try (Stream<String> lines = Files.lines(path)) { 12 line_result = lines.skip(line_number).findFirst().orElse(null); 13 if (line_result == null) System.err.println("out of lines."); 14 else System.out.println(line_result); 15 } 16 17 { 18 List<String> lines = Files.readAllLines(path); 19 if (lines.size() < line_number) System.err.println("out of lines."); 20 else { 21 line_result = lines.get(line_number); 22 System.out.println(line_result); 23 } 24 } 25 26 try (BufferedReader br = Files.newBufferedReader(path); 27 Stream<String> lines = br.lines();) { 28 line_result = lines.skip(line_number).findFirst().orElse(null); 29 if (line_result == null) System.err.println("out of lines."); 30 else System.out.println(line_result); 31 } 32 33 try (BufferedReader br = Files.newBufferedReader(path)) { 34 // skip動作 35 for (int i = 0; i < line_number; i++) { 36 br.readLine(); 37 } 38 if ((line_result = br.readLine()) == null) System.err.println("out of lines."); 39 else System.out.println(line_result); 40 } 41 } 42}

追記: 質問が更新される前のを見てたのでそういうプログラムだけ乗っけました。
ここからメソッド分割などして、セクションのいずれかを使って下さい。
なお、自分も初心者なので一応動くと思いますが、正しい動作をするとは限りません。

投稿2018/01/24 10:36

編集2018/01/24 10:39
smk7758

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileNotFoundException; 4import java.io.IOException; 5import java.net.URL; 6import java.nio.file.Files; 7import java.nio.file.Path; 8import java.nio.file.Paths; 9import java.util.Objects; 10import java.util.Optional; 11 12public class Q110417 { 13 private static final File EXECUTABLE_PATH = Objects.requireNonNull(getExecutablePath());// アプリケーションの実行パス 14 15 private static final File getExecutablePath() { 16 File f = null; 17 try { 18 URL location = Q110417.class.getProtectionDomain().getCodeSource().getLocation(); 19 f = new File(location.toURI().getPath()); 20 } catch (java.net.URISyntaxException ex) { 21 ex.printStackTrace(); 22 } 23 return f; 24 } 25 public static void main(String[] args) { 26 final int lineNumber = 3 - 1;// 行番号から-1を引いて0オリジンに変換 27 // テキストのファイルパス 28 Path path = Paths.get(EXECUTABLE_PATH.toString(), "sampretext.txt"); 29 try{ 30 try (BufferedReader br = Files.newBufferedReader(path)) { 31 Optional<String> line = br.lines().skip(lineNumber).findFirst(); 32 System.out.println(line.get()); 33 } 34 }catch(FileNotFoundException e){ 35 // エラーの場合は出力先は標準出力(System.out)ではなく 標準エラー出力(System.err)に 36 System.err.println(e); 37 }catch(IOException e){ 38 System.err.println(e); 39 } 40 } 41}

■参考情報

投稿2018/01/24 11:10

編集2018/01/24 13:31
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

LineNumberReader
は使えるかなとおもったが表面上だけでした(謎クラス)

投稿2018/01/24 09:57

編集2018/01/24 10:23
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/01/24 10:09

> setLineNumber(int)は、ストリーム内の現在位置を実際に変更するのではなく、getLineNumber()から返される値を変更するだけです。 指定行の読み込みには使えないかも...?
退会済みユーザー

退会済みユーザー

2018/01/24 10:27

よく読んだらそうみたいね。 なにこの実装?
guest

0

n行目を取得したい、という観点では
こんなstaticメソッドを作ったら便利かもしれないですね。

Java

1static String readLineAt(BufferedReader br, int line) throws IOException { 2 for(int i = 0; i < line; ++i) { 3 br.readLine(); 4 } 5 return br.readLine(); 6}

行数が高々知れている場合は、リストに全行放り込んだ方が楽かもしれません。

質問の仕方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

また、既に書きかけのコードがある場合、積極的に開示するようにしてください。

その他気になったこと

  • サンプルファイルの置き場所

C:\Program Filesに個人のファイルを置くことはあまりお勧めできません。
Windowsの場合Userフォルダ以下のどこかに置いた方が良いでしょう。

  • ファイルオブジェクトを生成していることについて

FileReaderにはファイルパスを取るコンストラクタがありますよ。

  • ループで毎周strにnullを代入していることについて

毎周上書きされるので無駄です。

既存のファイルと被らないための配慮かもわかりませんが...
sampre_proguramuじゃなくてSampleProgramだと思う。

投稿2018/01/24 09:46

編集2018/01/24 10:47
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/24 10:04 編集

その前に3行目まで読み取って四行目以外ではnullな気がするのは気のせいだろう(多分) とおもったら編集で追加された場所か
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問