【问题标题】:Java - Read and Write a .txt fileJava - 读取和写入 .txt 文件
【发布时间】:2015-05-29 19:03:30
【问题描述】:

我想从 .txt 文件(在本例中为 input.txt)读取行并将它们写入另外两个 .txt 文件,具体取决于每行开头的整数是奇数还是偶数。我必须使用 DataInputStream / DataOutputStream 和 BufferedInputStream / BufferedOutputStream。

输入文件如下所示。

1 String1 1.1
2 String2 2.2
3 String3 3.3
4 String4 4.4
5 String5 5.5
6 String6 6.6
7 String7 7.7
8 String8 8.8
9 String9 9.9
10 String10 10.1

当我运行程序时,我在 readUTF 部分收到 EOFException。当我评论这些部分并尝试只写整数时,我在奇数文件中只得到“1”,在偶数文件中只得到“2”。它不会复制所有整数。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.EOFException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;

public class datastream {
    public static void main(String[] args) throws IOException {

        DataInputStream inputStream = null;
        DataOutputStream outputStreamEven = null;
        DataOutputStream outputStreamOdd = null;
        	
        try {
            inputStream = new DataInputStream (new BufferedInputStream ( new FileInputStream("src/input.txt")));
            outputStreamEven = new DataOutputStream (new BufferedOutputStream ( new FileOutputStream("src/even.txt")));
            outputStreamOdd = new DataOutputStream (new BufferedOutputStream ( new FileOutputStream("src/odd.txt")));

            int number;
            String textinput;
            double doublenumber;
            
            number = inputStream.readInt();
            textinput = inputStream.readUTF();
            doublenumber = inputStream.readDouble();
            
            while ((number = inputStream.read()) % 2 != 0) {
            	outputStreamOdd.writeInt(number);
            	outputStreamOdd.writeUTF(textinput);
                outputStreamOdd.writeDouble(doublenumber);	
            }
            
            while ((number = inputStream.read()) % 2 == 0) {
            	outputStreamEven.writeInt(number);
            	outputStreamEven.writeUTF(textinput);
            	outputStreamEven.writeDouble(doublenumber);
            }
            
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStreamEven != null) {
                outputStreamEven.close();
            }
            if (outputStreamOdd != null) {
                outputStreamOdd.close();
            }
        }
    }
}

如何将所有行复制到适当的文本文件(以及每行包含其所有内容)?

【问题讨论】:

  • DataInputStream 和 DataOutputStream 并没有像你想象的那样做。
  • 正如 immibis 所说,它可能没有达到您的预期。为什么不使用BufferedReaderBufferedWriter?它们要简单得多。 BufferedReader fd = new BufferedReader(new FileReader(filename));,读作fd.readLine(),然后拆分所有这些值。顺便说一句,您应该捕获异常并停止对文件的读/写。
  • EOFException 的哪一部分你不明白?你到了文件的末尾:你应该停止阅读它。但是如果它是一个文本文件,你不应该在上面使用readUTF()readUTF() 方法只理解writeUTF() 写入的数据。如果是行,你应该使用BufferedReader.readLine().谁说你必须使用DataInput/OutputStream来读取或写入文本文件是错误的。
  • 我认为您不需要在 FileInputStream 之上添加 BufferedInputStream。不应该只使用FileInputStream 声明您的DataInputStream 吗?比如inputStream = new DataInputStream (new FileInputStream("src/input.txt"));DataOutputStream也是一样。
  • @BinaryJudy 你几乎总是需要在任何其他Reader 之上添加一个BufferedReader,除了另一个BufferedReader。在这种情况下,OP 需要读取 FileReader 不支持而 BufferedReader 支持的行。

标签: java file input output


【解决方案1】:

您正在处理一个文本文件,因此您应该使用字符流来处理它。

所以使用 BufferedReader 和 BufferedWriter 可以帮助您以简单的方式解决这个问题。这是执行此操作的代码。我已将您的示例数据复制到一个文本文件中,并将其命名为 sourceData.txt

public class OddEvenFileManager {

    public static final String DATA_SOURCE_PATH = "sourceDatas.txt";
    public static final String ODD_TARGET_PATH =  "oddDatas.txt";
    public static final String EVEN_TARGET_PATH = "evenDatas.txt";


    public static void doOddEvenSplitting() throws IOException,     NumberFormatException {

        BufferedReader sourceReader = new BufferedReader(new FileReader(new     File(DATA_SOURCE_PATH)));
        BufferedWriter oddWriter = new BufferedWriter(new FileWriter(new     File(ODD_TARGET_PATH)));
        BufferedWriter evenWriter = new BufferedWriter(new FileWriter(new     File(EVEN_TARGET_PATH)));

        String sourceLine = null;

        while ((sourceLine = sourceReader.readLine()) != null) {
            int lineNumber = Integer.parseInt(sourceLine.split(" ")[0]);

            if (lineNumber % 2 == 0) {
                evenWriter.write(sourceLine);
                evenWriter.newLine();

            } else {
                oddWriter.write(sourceLine);
                oddWriter.newLine();
            }

        }

        sourceReader.close();
        oddWriter.close();
        evenWriter.close();

    }

    public static void main(String[] args) throws IOException,     NumberFormatException {
        doOddEvenSplitting();
    }
}    

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多