2025年Java读取文件的N种方法

Java读取文件的N种方法1 概述 在这篇文章里 我们将探索不同的方式从文件中读取数据 首先 学习通过标准的的 Java 类 从 classpath URL 或者 Jar 中加载文件 然后 学习通用 BufferedRead Scanner StreamTokeni DataInputStr SequenceInpu

大家好,我是讯享网,很高兴认识大家。

首先, 学习通过标准的的Java类,从classpath、URL或者Jar中加载文件。

然后,学习通用BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream, FileChannel读取文件内容。也会讨论如何读取UTF-8编码的文件。

最后,学习Java7和Java8中新的加载和读取文件的技术。

这篇文章的很多示例,从名为fileTest.txt的文件读取文本内容,文件包含

2.2 辅助方法

很多示例都会用到共用的方法readFromInputStream, 该方法将InputStream转化String

   

private String readFromInputStream(InputStream inputStream)             throws IOException {         StringBuilder resultStringBuilder = new StringBuilder();         try (BufferedReader br                      = new BufferedReader(new InputStreamReader(inputStream))) {             String line;             while ((line = br.readLine()) != null) {               resultStringBuilder.append(line).append("\n");             }         }         return resultStringBuilder.toString();     } 

讯享网


3.从Classpath读取文件
3.1 使用标准Java

从src/main/resources读取文件fileTest.txt

   

讯享网@Test     public void test() throws IOException {         String expectedData = "Hello,World!";         Class<ReadFileTest> clazz = ReadFileTest.class;         InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt");         String data = readFromInputStream(inputStream);           Assert.assertThat(data, containsString(expectedData));     }

ClassLoader中相同的方法也可以使用。

ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("fileTest.txt");
String data = readFromInputStream(inputStream);
这两种方法的主要区别是, 当前类的ClassLoader的getResourceAsStream方法,入参路径是从classpath开始。

而类实例的入参是相对于包路径,但路径开始使用'/'符号, 也是绝对路径。

特别要注意的是, 文件打开读取完数据后, 始终需要关闭

另一个比较常用的方法是使用commons-io包里的FileUtils.readFileToString方法。

       

<dependency>             <groupId>commons-io</groupId>             <artifactId>commons-io</artifactId>             <version>1.4</version>         </dependency>     @Test     public void useCommonIO() throws IOException {         String expectedData = "Hello,World!";           ClassLoader classLoader = getClass().getClassLoader();         File file = new File(classLoader.getResource("fileTest.txt").getFile());         String data = FileUtils.readFileToString(file, "UTF-8");           assertEquals(expectedData, data.trim());     }


该方法入参是File对象。这个工具类的优点是不用编码InputStream实例的相关代码。
这个库还提供了IOUtils类。

   

讯享网@Test     public void useCommonIO2() throws IOException {         String expectedData = "Hello,World!";           FileInputStream fis = new FileInputStream("src/test/resources/fileTest.txt");         String data = IOUtils.toString(fis, "UTF-8");           assertEquals(expectedData, data.trim());     } 4.BufferedReader @Test public void bufferedReader() throws IOException {     String expected_value = "Hello,World!";     String file ="src/test/resources/fileTest.txt";       BufferedReader reader = new BufferedReader(new FileReader(file));     String currentLine = reader.readLine();     reader.close();       assertEquals(expected_value, currentLine); }


讯享网

5.1读取小文件

首先看一下关于Files.readAllLines的示例

   

@Test     public void readSmallFile()  throws IOException {         String expected_value = "Hello,World!";           Path path = Paths.get("src/test/resources/fileTest.txt");           String read = Files.readAllLines(path).get(0);         assertEquals(expected_value, read);     }

如果读取的是二进制文件,可以使用Files.readAllBytes()方法

5.2读取大文件

如果想要读取大文件, 我们可以使用Files类和BufferedReader类。

   

讯享网@Test     public void readLargeFile() throws IOException {         String expected_value = "Hello,World!";           Path path = Paths.get("src/test/resources/fileTest.txt");           BufferedReader reader = Files.newBufferedReader(path);         String line = reader.readLine();         assertEquals(expected_value, line);     }

在JDK8中,Files类增加了lines方法,这个方法将返回Stream<String>。跟文件操作一样,Stream需要显式调用的close()。Files API提供了很多简单读取文件的方法。

@Test public void whenReadWithScanner_thenCorrect()         throws IOException {     String file = "src/test/resources/fileTest.txt";     Scanner scanner = new Scanner(new File(file));     scanner.useDelimiter(",");       assertTrue(scanner.hasNext());     assertEquals("Hello", scanner.next());     assertEquals("World!", scanner.next());       scanner.close(); }

tokenizer.nval - 如果类型为Number时,读取该字段

tokenizer.sval - 如果类型为String时,读取该字段

讯享网@Test public void readWithTokenize()         throws IOException {     String file = "src/test/resources/fileTestTokenizer.txt";     FileReader reader = new FileReader(file);     StreamTokenizer tokenizer = new StreamTokenizer(reader);       //  1     tokenizer.nextToken();     assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype);     assertEquals("Hello", tokenizer.sval);       //  2     tokenizer.nextToken();     assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype);     assertEquals(1, tokenizer.nval, 0.0000001);       //  3     tokenizer.nextToken();     assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype);     reader.close(); }
@Test public void whenReadWithDataInputStream() throws IOException {     String expectedValue = "Hello,World!";     String file ="src/test/resources/fileTest.txt";     String result = null;       DataInputStream reader = new DataInputStream(new FileInputStream(file));     int nBytesToRead = reader.available();     if(nBytesToRead > 0) {         byte[] bytes = new byte[nBytesToRead];         reader.read(bytes);         result = new String(bytes);     }       assertEquals(expectedValue, result); } package com.pl; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.IOException; public class ccs_2 { public static void main(String[] args) throws IOException { String expectedValue = ""; String file = "C:\\Users\\Administrator\\Desktop\\1.txt"; //result = null; DataInputStream reader = new DataInputStream(new FileInputStream(file)); int nBytesToRead = reader.available(); if (nBytesToRead > 0) { byte[] bytes = new byte[nBytesToRead]; reader.read(bytes); expectedValue = new String(bytes); } System.out.printf("\n====" + expectedValue); } } 
讯享网@Test public void whenReadWithFileChannel()         throws IOException {     String expected_value = "Hello,World!";     String file = "src/test/resources/fileTest.txt";     RandomAccessFile reader = new RandomAccessFile(file, "r");     FileChannel channel = reader.getChannel();       int bufferSize = 1024;     if (bufferSize > channel.size()) {         bufferSize = (int) channel.size();     }     ByteBuffer buff = ByteBuffer.allocate(bufferSize);     channel.read(buff);     buff.flip();       assertEquals(expected_value, new String(buff.array()));     channel.close();     reader.close(); } package com.pl; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ccs_2 { public static void main(String[] args) throws IOException { //throws IOException { String expected_value = ""; String file = "C:\\Users\\Administrator\\Desktop\\1.txt"; RandomAccessFile reader = new RandomAccessFile(file, "r"); FileChannel channel = reader.getChannel(); int bufferSize = 1024; if (bufferSize > channel.size()) { bufferSize = (int) channel.size(); } //} ByteBuffer buff = ByteBuffer.allocate(bufferSize); channel.read(buff); buff.flip(); expected_value = new String(buff.array()); //assertEquals(expected_value, new String(buff.array())); channel.close(); reader.close(); System.out.printf("\n====" + expected_value); } } 
@Test public void whenReadUTFEncodedFile()         throws IOException {     String expected_value = "你好,世界!";     String file = "src/test/resources/fileTestUtf8.txt";     BufferedReader reader = new BufferedReader             (new InputStreamReader(new FileInputStream(file), "UTF-8"));     String currentLine = reader.readLine();     reader.close();       assertEquals(expected_value, currentLine); } package com.pl; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class ccs_2 { public static void main(String[] args) throws IOException { // File file = new File("C:\\Program Files"); // // //System.out.println(file.list()); // String[] A = file.list(); // for (int i = 0; i < A.length; i++) { // System.out.printf("\n=====" + A[i]); // } String expected_value = "你好,世界!"; String file = "C:\\Users\\Administrator\\Desktop\\1.txt"; BufferedReader reader = new BufferedReader (new InputStreamReader(new FileInputStream(file), "UTF-8")); String currentLine = reader.readLine(); reader.close(); System.out.printf("\n====" + currentLine); } } 

讯享网@Test public void readFromURL() throws IOException {     URL urlObject = new URL("https://www.baidu.com");     URLConnection urlConnection = urlObject.openConnection();     InputStream inputStream = urlConnection.getInputStream();     String data = readFromInputStream(inputStream); } 


12.从jar包中读取文件
我们的目标是读取junit-4.12.jar包中的LICENSE-junit.txt文件。clazz只需要这个Jar中的类就行。

@Test public void readFromJar() throws IOException {     String expectedData = "Eclipse Public License";       Class clazz = Test.class;     InputStream inputStream = clazz.getResourceAsStream("/LICENSE-junit.txt");     String data = readFromInputStream(inputStream);       Assert.assertThat(data, containsString(expectedData)); }

小讯
上一篇 2025-02-07 14:12
下一篇 2025-03-31 23:05

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/52633.html