做海淘的网站,网站优化具体怎么做,重庆网站推广 软件,杭州企业排行榜1.概述 在这篇文章里#xff0c; 我们将探索不同的方式从文件中读取数据。
首先#xff0c; 学习通过标准的的Java类#xff0c;从classpath、URL或者Jar中加载文件。
然后#xff0c;学习通用BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInput…1.概述 在这篇文章里 我们将探索不同的方式从文件中读取数据。
首先 学习通过标准的的Java类从classpath、URL或者Jar中加载文件。
然后学习通用BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream, FileChannel读取文件内容。也会讨论如何读取UTF-8编码的文件。
最后学习Java7和Java8中新的加载和读取文件的技术。
2.准备 2.1 输入文件
这篇文章的很多示例从名为fileTest.txt的文件读取文本内容文件包含
Hello,World! 有少量示例 我们会读取不同的文件 示例中会有说明。
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 Testpublic void test() throws IOException {String expectedData Hello,World!;ClassReadFileTest clazz ReadFileTest.class;InputStream inputStream clazz.getResourceAsStream(/fileTest.txt);String data readFromInputStream(inputStream);Assert.assertThat(data, containsString(expectedData));} 在上面的代码中我们通过当前类的getResourceAsStream方法加载文件入参是绝对路径。
ClassLoader中相同的方法也可以使用。
ClassLoader classLoader getClass().getClassLoader(); InputStream inputStream classLoader.getResourceAsStream(fileTest.txt); String data readFromInputStream(inputStream); 这两种方法的主要区别是 当前类的ClassLoader的getResourceAsStream方法入参路径是从classpath开始。
而类实例的入参是相对于包路径但路径开始使用/符号 也是绝对路径。
特别要注意的是 文件打开读取完数据后 始终需要关闭
inputStream.close(); 3.2 使用commons-io库
另一个比较常用的方法是使用commons-io包里的FileUtils.readFileToString方法。 dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion1.4/version/dependencyTestpublic 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类。 Testpublic 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);
} 当读取结束的时候 reader.readLine()会返回null
5.Java NIO NIO是在JDK7中添加。
5.1读取小文件
首先看一下关于Files.readAllLines的示例 Testpublic 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);} 入参Path对象Path可以认为是java.io.File的升级版本提供一些额外的功能。
如果读取的是二进制文件可以使用Files.readAllBytes()方法
5.2读取大文件
如果想要读取大文件 我们可以使用Files类和BufferedReader类。 Testpublic 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);} 5.3Files.lines
在JDK8中Files类增加了lines方法这个方法将返回StreamString。跟文件操作一样Stream需要显式调用的close()。Files API提供了很多简单读取文件的方法。
6.Scanner 下面我们将使用Scanner读取文件使用逗号(,)作为定界符(delimiter)。
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();
} Scanner默认的定界符是空格。它适用于从控制台读取输入或者内容有固定定界符的内容时。
7.StreamTokenizer tokenizer会指出下一个token的类型String或Number。
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);// 1tokenizer.nextToken();assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype);assertEquals(Hello, tokenizer.sval);// 2tokenizer.nextToken();assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype);assertEquals(1, tokenizer.nval, 0.0000001);// 3tokenizer.nextToken();assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype);reader.close();
}
8.DataInputStream 如果要读取二进制文件或者原生数据可以使用DataInputStream
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);}
}
9.FileChannel 如果读取的是一个大文件FileChannel速度会超过standard IO。
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);}
}10.读取utf-8编码的文件
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);}
}11.从URL读取数据
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));
}