【问题标题】:reading and writing txt files读取和写入txt文件
【发布时间】:2019-12-01 19:01:26
【问题描述】:

我正在开发一个 java 程序,其中:

程序读取两个 txt 文件(txt1 和 txt2),然后从每个 txt1 和 txt2 中交替打印出 txt1 和 txt2 到 txt3。

示例: txt1 =

这是第一个 是 一个

txt2= 那 曾是 两个

txt3 应该是: 这是第一个 那 是 曾是 一 两个

我不确定我错过了什么...任何帮助将不胜感激。

代码:

package combine;

import java.io.*;
import java.util.*;
import java.nio.file.*;

public class Main{

public static void main(String[] args) throws IOException{
   String targetDir = "C:\\Parts";
   String outputFile = "C:\\Parts\\complete\\TheRavensGreenEggs.txt";

   File dir = new File(targetDir);
   File[] files = dir.listFiles(new FilenameFilter() {
     // Only import "txt" files
     @Override
     public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

// Reads all "txt" file lines into a List
List<String> inputFileLines = new ArrayList<>();{
for (File file : files) {
    inputFileLines.addAll(Files.readAllLines(Paths.get(file.getAbsolutePath())));
}}


// Writes the List to the console
for (String line : inputFileLines) {
    System.out.println(line);
}

// Writes the List to a single "TheRavensGreenEggs.txt" file
Files.write(Paths.get(outputFile), inputFileLines, StandardOpenOption.CREATE);
}}

【问题讨论】:

  • 您缺少替代部分,您的代码没有尝试这样做,您只需要编写代码即可。
  • @luk2302 这就是我卡住的地方......我不确定我是否使用“inputFilesLines.?”还是有更好的分割线的方法?
  • 如果您创建一个 for 循环 - 每个循环都会为每个文件输出该行。如果文件长度不同,则循环最短文件的次数,或检查以确保文件包含特定行。

标签: java writing


【解决方案1】:

像这样使用List&lt;String&gt;java.nio

public static void main(String[] args) {
    // define the input paths and the output path
    Path file01Path = Paths.get("Y:\\our\\path\\to\\file_01.txt");
    Path file02Path = Paths.get("Y:\\our\\path\\to\\file_02.txt");
    Path outputPath = Paths.get("Y:\\our\\path\\to\\result.txt");
    // provide a list for the alternating lines
    List<String> resultLines = new ArrayList<>();

    try {
        // read the lines of both files and get them as lists of Strings
        List<String> linesOfFile01 = Files.readAllLines(file01Path);
        List<String> linesOfFile02 = Files.readAllLines(file02Path);
        // find a common border for the iteration: the size of the bigger list
        int maxSize = (linesOfFile01.size() >= linesOfFile02.size())
                ? linesOfFile01.size() : linesOfFile02.size();

        // then loop and store the lines (if there are any) in a certain order
        for (int i = 0; i < maxSize; i++) {
            // lines of file 01 first
            if (i < linesOfFile01.size()) {
                resultLines.add(linesOfFile01.get(i));
            }
            // lines of file 02 second
            if (i < linesOfFile02.size()) {
                resultLines.add(linesOfFile02.get(i));
            }
        }

        // after all, write the content to the result path
        Files.write(outputPath,
                resultLines,
                Charset.defaultCharset(),
                StandardOpenOption.CREATE_NEW);
    } catch (IOException e) {
        System.err.println("Some files system operation failed:");
        e.printStackTrace();
    }
}

【讨论】:

  • 我得到一个越界错误:线程“main”中的异常 java.lang.IndexOutOfBoundsException:索引 73 超出 java.base/jdk.internal.util.Preconditions.outOfBounds 长度 73 的范围(Preconditions.java:64) 在 java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 在 java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) 在java.base/java.util.Objects.checkIndex(Objects.java:372) at java.base/java.util.ArrayList.get(ArrayList.java:458) at combine.Main.main(Main.java:30)
  • @fiefie1 对不起,这是一个错字,我已经更正了。请再次检查代码...
【解决方案2】:

这种方法仍然使用您的大部分原始代码。

这个想法是为每个文件保留单独的行列表,然后循环遍历总行数,在每次迭代时切换到不同的列表。

如果文件中的行数不同,则需要添加一些逻辑(否则访问不存在的行号时会出现 IndexOutOfBounds 错误)

package combine;

import java.io.*;
import java.util.*;
import java.nio.file.*;

public class Main{

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

       String targetDir = "C:\\Parts";
       String outputFile = "C:\\Parts\\complete\\TheRavensGreenEggs.txt";

       File dir = new File(targetDir);
       File[] files = dir.listFiles(new FilenameFilter() {
           // Only import "txt" files
           @Override
           public boolean accept(File dir, String name) {
               return name.toLowerCase().endsWith(".txt");
           }
       });

       // Reads all "txt" file lines into a List
       List<List<String>> inputFileLines = new ArrayList<>();{
       for (File file : files){ 
       inputFileLines.add(Files.readAllLines(Paths.get(file.getAbsolutePath()))) 
       }


       // Writes the List to the console
       int n = inputFileLines.size();  // number of files
       int m = inputFileLines.get(0).size() * n; // number of lines in total
       for (int i=0;i<m;i++) {
       System.out.println(inputFileLines.get(i % n).get(i / n));
       }

       // Writes the List to a single "TheRavensGreenEggs.txt" file
       // should be the same as printing to console
    }
}

【讨论】:

  • 我确实收到了你提到的越界错误,但是每个 txt 文档有 73 行......想法?
  • 在抛出错误之前是否以交替顺序打印所有行?
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2013-02-02
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
相关资源
最近更新 更多