代码之家  ›  专栏  ›  技术社区  ›  Ebillson GRAND JEAN

读者BufferedReader的readLine()导致以下情况:线程“main”java中出现异常。io。IOException:流已关闭

  •  0
  • Ebillson GRAND JEAN  · 技术社区  · 3 年前

    以下是我的主要Java函数的代码片段:

    try (MultiFileReader multiReader = new MultiFileReader(inputs)) {
            PriorityQueue<WordEntry> words = new PriorityQueue<>();
            for (BufferedReader reader : multiReader.getReaders()) {
                String word = reader.readLine();
                if (word != null) {
                    words.add(new WordEntry(word, reader));
                }
            }
        }
    

    public List<BufferedReader> getReaders() {
            return Collections.unmodifiableList(readers);
        }
    

    This is the error generated when I compile my code

    错误恰好发生在我写的那行 String word = reader.readLine(); 奇怪的是 reader.readLine() 实际上不是null multiReader.getReaders()

    我把问题贴在哪里了,现在让我对我的代码有一个更广泛的看法。要运行它,只需在src/directory下编译它 javac *.java java MergeShards shards/ sorted.txt shards/ src/ .txt 我的场景中的文件。

    • 这是 MergeShards.java 我的主要职能是:
    import java.io.BufferedReader;
    import java.io.Writer;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.List;
    import java.util.Objects;
    import java.util.PriorityQueue;
    import java.util.stream.Collectors;
    
    public final class MergeShards {
        public static void main(String[] args) throws Exception {
            if (args.length != 2) {
                System.out.println("Usage: MergeShards [input folder] [output file]");
                return;
            }
    
            List<Path> inputs = Files.walk(Path.of(args[0]), 1).skip(1).collect(Collectors.toList());
            Path outputPath = Path.of(args[1]);
    
            try (MultiFileReader multiReader = new MultiFileReader(inputs)) {
                PriorityQueue<WordEntry> words = new PriorityQueue<>();
                for (BufferedReader reader : multiReader.getReaders()) {
                    String word = reader.readLine();
                    if (word != null) {
                        words.add(new WordEntry(word, reader));
                    }
                }
    
                try (Writer writer = Files.newBufferedWriter(outputPath)) {
                    while (!words.isEmpty()) {
                        WordEntry entry = words.poll();
                        writer.write(entry.word);
                        writer.write(System.lineSeparator());
                        String word = entry.reader.readLine();
                        if (word != null) {
                            words.add(new WordEntry(word, entry.reader));
                        }
                    }
                }
            }
        }
    
        private static final class WordEntry implements Comparable<WordEntry> {
            private final String word;
            private final BufferedReader reader;
    
            private WordEntry(String word, BufferedReader reader) {
                this.word = Objects.requireNonNull(word);
                this.reader = Objects.requireNonNull(reader);
            }
    
            @Override
            public int compareTo(WordEntry other) {
                return word.compareTo(other.word);
            }
        }
    }
    
    • 这是我的 MultiFileReader.java 文件:
    import java.io.BufferedReader;
    import java.io.Closeable;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public final class MultiFileReader implements Closeable {
    
        private final List<BufferedReader> readers;
    
        public MultiFileReader(List<Path> paths) {
            readers = new ArrayList<>(paths.size());
            try {
                for (Path path : paths) {
                    readers.add(Files.newBufferedReader(path));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                close();
            }
        }
    
        public List<BufferedReader> getReaders() {
            return Collections.unmodifiableList(readers);
        }
    
        @Override
        public void close() {
            for (BufferedReader reader : readers) {
                try {
                    reader.close();
                } catch (Exception ignored) {
                }
            }
        }
    }
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Elliott Frisch    3 年前

    finally

    public MultiFileReader(List<Path> paths) {
        readers = new ArrayList<>(paths.size());
        try {
            for (Path path : paths) {
                readers.add(Files.newBufferedReader(path));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } /* Not this. finally {
            close();
        } */
    }