5

Javaを使用してテキストファイルをコンソールに出力しようとしています。私はそうするための最も効率的な方法は何だろうと思っていましたか?

私はいくつかの方法を研究しましたが、パフォーマンスへの影響が最も少ないソリューションを識別するのは困難です。

テキストファイルをコンソールに出力するには、ファイルの各行を読み込んでから、コンソールに書き込む必要があります。

使用する方が良いですか:

  1. FileReaderを使用してバッファリングされたリーダー、行を読み取り、一連のsystem.out.println呼び出しを実行しますか?

    BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); 
    while (in.readLine() != null) {
          System.out.println(blah blah blah);          
    }         
    in.close();
    
  2. スキャナーがファイルの各行を読み取り、system.print呼び出しを実行していますか?

    while (scanner.hasNextLine()) { 
        System.out.println(blah blah blah);   
    }
    

ありがとう。

4

6 に答える 6

5

ファイルの内容をコンソールに出力するだけの場合(そして次のint / doubleなどを出力したくない場合)は、aで問題ありませんBufferedReader

ただし、コードをそのまま使用しても、目的の結果は得られません。代わりにこれを試してください:

BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\log001.txt"));
String line = in.readLine();
while(line != null)
{
  System.out.println(line);
  line = in.readLine();
}
in.close();

主なボトルネックは、Javaが送信している情報を印刷するコンソールの機能である可能性が高いためですが、私はそれについてあまり夢中にならないでしょう。

于 2010-10-07T22:21:14.240 に答える
4

テキストファイルに含まれている文字ベースのデータに興味がない場合は、バイトとして「生」でストリーミングするだけです。

InputStream input = new BufferedInputStream(new FileInputStream("C:/logs.txt"));
byte[] buffer = new byte[8192];

try {
    for (int length = 0; (length = input.read(buffer)) != -1;) {
        System.out.write(buffer, 0, length);
    }
} finally {
    input.close();
}

これにより、バイトと文字の間で不必要にマッサージしたり、改行をスキャンして分割したり、それらをもう一度追加したりするコストを節約できます。

パフォーマンスに関しては、この記事がおもしろいと思うかもしれません。記事によると、バイト配列から直接FileChannelラップされて書き込まれる256Kバイト配列のaが最速の方法です。ByteBuffer

FileInputStream input = new FileInputStream("C:/logs.txt");
FileChannel channel = input.getChannel();
byte[] buffer = new byte[256 * 1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);

try {
    for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
        System.out.write(buffer, 0, length);
        byteBuffer.clear();
    }
} finally {
    input.close();
}
于 2010-10-07T22:27:33.137 に答える
3

比較的小さなファイルの場合、これを行う1行のJava7以降の方法は次のとおりです。

System.out.println(new String(Files.readAllBytes(Paths.get("logs.txt"))));

詳細については、 https://docs.oracle.com/javase/7/docs/api/java/nio/file/package-summary.htmlを参照してください。

乾杯!

于 2016-09-21T00:44:50.043 に答える
2

ファイルの内容を処理せずにコンソールに最も効率的にダンプするだけの場合は、データを文字に変換して改行を見つける必要はありません。代わりに、ファイルからバイトのブロックを読み取り、書き込みを行ってから、次の場所に直接書き込むことができますSystem.out

package toconsole;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class Main {
    public static void main(String[] args) {
        BufferedInputStream bis = null;
        byte[] buffer = new byte[8192];
        int bytesRead = 0;
        try {
            bis = new BufferedInputStream(new FileInputStream(args[0]));
            while ((bytesRead = bis.read(buffer)) != -1) {
                System.out.write(buffer, /* start */ 0, /* length */ bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try { bis.close(); } catch (Exception e) { /* meh */ }
        }
    }
}

この種のイディオムに出会ったことがない場合は、while条件のステートメントで、bis.readの結果がbytesReadに割り当てられ、-1と比較されます。したがって、ファイルの最後にいることが通知されるまで、バイトをバッファに読み込み続けます。また、System.out.writeでbytesReadを使用して、読み取ったばかりのバイトのみを書き込むようにします。これは、すべてのファイルの長さが8kBの倍数であるとは想定できないためです。

于 2010-10-07T22:29:18.937 に答える
0
FileInputStream input = new FileInputStream("D:\\Java\\output.txt");
    FileChannel channel = input.getChannel();
    byte[] buffer = new byte[256 * 1024];
    ByteBuffer byteBuffer = ByteBuffer.wrap(buffer); 

    try {
        for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
            System.out.write(buffer, 0, length);
            byteBuffer.clear();
        }
    } finally {
        input.close();
    }


    Path temp = Files.move 
            (Paths.get("D:\\\\Java\\\\output.txt"),  
            Paths.get("E:\\find\\output.txt")); 

            if(temp != null) 
            { 
                System.out.println("File renamed and moved successfully"); 
            } 
            else
            { 
                System.out.println("Failed to move the file"); 
            } 

}
于 2020-04-15T09:42:09.010 に答える
0

Java 1 1の場合、より便利なアプローチを使用できます。

Files.copy(Path.of("file.txt"), System.out);

または、より高速な出力の場合:

var out = new BufferedOutputStream(System.out);
Files.copy(Path.of("file.txt"), out);
out.flush();
于 2021-03-24T18:25:17.390 に答える