直爽的熊猫 · java.lang.noclassdeffo ...· 3 周前 · |
阳刚的青蛙 · 【错误记录】Windows ...· 1 周前 · |
酷酷的扁豆 · 【错误记录】Windows ...· 1 周前 · |
乖乖的手术刀 · Python狼人之夜--文字冒险游戏 - ...· 1 年前 · |
强健的汤圆 · 对象没有存储在谷歌应用引擎数据存储中· 1 年前 · |
才高八斗的移动电源 · Debugging feature for ...· 1 年前 · |
迷茫的打火机 · docker:了解docker网络和自定义d ...· 1 年前 · |
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。
下面是创建 BufferedReader 的基本语法:
BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。
每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。
下面的程序示范了用 read() 方法从控制台不断读取字符直到用户输入 q 。
以上实例编译运行结果如下:
输入字符, 按下 'q' 键退出。 runoob
它的一般格式是:
以上实例编译运行结果如下:
Enter lines of text. Enter 'end' to quit. This is line one This is line one This is line two This is line twoJDK 5 后的版本我们也可以使用 Java Scanner 类来获取控制台的输入。
PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。
PrintStream 定义 write() 的最简单格式如下所示:
该方法将 byteval 的低八位字节写到流中。 下面的例子用 write() 把字符 "A" 和紧跟着的换行符输出到屏幕:
运行以上实例在输出窗口输出 "A" 字符
注意: write() 方法不经常使用,因为 print() 和 println() 方法用起来更为方便。 如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
下面将要讨论的两个重要的流是 FileInputStream 和 FileOutputStream 。
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
上面的程序首先创建文件test.txt,并把给定的数字以二进制形式写进该文件,同时输出到控制台上。
以上代码由于是二进制写入,可能存在乱码,你可以使用以下代码实例来解决乱码问题:
还有一些关于文件和I/O的类,我们也需要知道:
File Class(类)File类中有两个方法可以用来创建文件夹:
mkdir( ) 方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。 mkdirs() 方法创建一个文件夹和它的所有父文件夹。 下面的例子创建 "/tmp/user/java/bin"文件夹:
编译并执行上面代码来创建目录 "/tmp/user/java/bin"。
注意: Java 在 UNIX 和 Windows 自动按约定分辨文件路径分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/) ,路径依然能够被正确解析。 一个目录其实就是一个 File 对象,它包含其他文件和文件夹。
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。
可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
下面展示的例子说明如何使用 list() 方法来检查一个文件夹中包含的内容:
以上实例编译运行结果如下:
目录 /tmp bin 是一个目录 lib 是一个目录 demo 是一个目录 test.txt 是一个文件 README 是一个文件 index.html 是一个文件 include 是一个目录删除文件可以使用 java.io.File.delete() 方法。
以下代码会删除目录 /tmp/java/ ,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
测试目录结构:
/tmp/java/ |-- 1.log |-- test童帅的二叔
120***7857@qq.com
自己写了一个简单的小程序用来剪辑特定长度的音频,并将它们混剪在一起,大体思路是这样的:
1. 使用 FileInputStream 输入两个音频
2. 使用 FileInputStream的skip(long n) 方法跳过特定字节长度的音频文件,比如说:输入 skip(1024*1024*3),这样就能丢弃掉音频文件前面的 3MB 的内容。
3. 截取中间特定长度的音频文件:每次输入 8KB 的内容,使用 count 记录输入次数,达到设置的次数就终止音频输入。比如说要截取 2MB 的音频,每次往输入流中输入 8KB 的内容,就要输入 1024*2/8 次。
4. 往同一个输出流 FileOutputStream 中输出音频,并生成文件,实现音频混合。
下面就给出相关代码:
public class MusicCompound public static void main(String args[]) FileOutputStream fileOutputStream = null; FileInputStream fileInputStream = null; String fileNames[] = {"E:/星月神话.mp3","E:/我只在乎你.mp3"}; //设置byte数组,每次往输出流中传入8K的内容 byte by[] = new byte[1024*8]; fileOutputStream = new FileOutputStream("E:/合并.mp3"); for(int i=0;i<2;i++) int count = 0; fileInputStream = new FileInputStream(fileNames[i]); //跳过前面3M的歌曲内容 fileInputStream.skip(1024*1024*3); while(fileInputStream.read(by) != -1) fileOutputStream.write(by); count++; System.out.println(count); //要截取中间2MB的内容,每次输入8k的内容,所以输入的次数是1024*2/8 if(count == (1024*2/8)) break; catch(FileNotFoundException e) e.printStackTrace(); catch(IOException e) e.printStackTrace(); finally //输出完成后关闭输入输出流 fileInputStream.close(); fileOutputStream.close(); catch(IOException e) e.printStackTrace();童帅的二叔5年前 (2018-07-11)童帅的二叔
120***7857@qq.com
乔乔
287***2758@qq.com
有时需要列出目录下指定类型的文件,例如:. java、. txt 等扩展名的文件。可以使用File类的下述两个方法,列出指定类型的文件:
1、 public String[ ] list(FilenameFilter obj) 该方法用字符串的形式返回目录下的指定类型的所有文件 2、 public File[ ] listFile(FilenameFilter obj) 该方法用 File 对象形式返回目录下的指定类型的所有文件上述两个方法的参数 FilenameFilter 是一个接口,该接口有一个方法:
public boolean accept(File f,String name);
File 对象 f 调用 list 方法时,需向该方法传递一个实现 FilenameFilter 接口的对象,list 方法执行时,参数 obj 不断回调接口方法accept(File f,String name),该方法中的参数 f 为,调用 list 的当前目录,参数 name 被实例化为当前目录中的一个文件名,当接口方法返回 true 时,list 方法就将名字为 name 的文件存放到返回的数组中。
import java.io.*; public class Filelei implements FilenameFilter {//此次使用本类作为接口 * @param args public void f(){ File f=new File("E:\\Myworkspace\\08\\src"); String []filename=f.list();//以字符串的形式,先列出当前目录下所有文件看一下(有什么类型的文件) for(int i=0;i<filename.length;i++){ System.out.println(filename[i]); System.out.println("********************************"); String []fname=f.list(this); for(int i=0;i<fname.length;i++){ System.out.println(fname[i]); public static void main(String[] args) { // TODO Auto-generated method stub new Filelei().f(); @Override public boolean accept(File f, String name) {//重写接口方法 // TODO Auto-generated method stub return name.endsWith(".java");//返回当前目录下以.java结尾的文件运行结果:
A.java B.java C.java J1.java J2.java J3.java 我是 DOC 文档.doc 我是 XLS 工作表.xls 我是文本文档.txt ******************************** A.java B.java C.java J1.java J2.java J3.java
luffysman
N92***5465@stu.xjtu.edu.cn
FileOutputStream 读写文件举例中出现乱码, 跟字符集编码无关, 是由于读写的格式不同导致的。
// 读写文件, 以二进制读写, 有乱码, 是由于输入输出格式转换的原因, 和字符集编码方式无关 public static void main(String[] args) { try { byte[] bWrite = {11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("./out/test.txt"); for (int x = 0; x < bWrite.length; ++x) { os.write(bWrite[x]); os.close(); InputStream is = new FileInputStream("./out/test.txt"); int size = is.available(); for (int x = 0; x < size; ++x) { System.out.print((byte) is.read() + " "); //强转为byte类型就好了 is.close(); } catch (IOException e) { System.out.print("Exception");
iamanoob
599***619@qq.com
sky-wu
Wu_***@Foxmail.com
test.txt 内容为:
I love Java, I love JavaI love Java, I love JavaI love Java, I love JavaI love Java, I love JavaI love Java, I love Java
import java.io.*; public class Test { public static void main(String[] args) { File sourcefile = new File("./test.txt"); File copyfile = new File("./testcopy.txt"); FileInputStream fileInputStream = null;// 从文件中读数据 FileOutputStream fileOutputStream = null;// 用于把数据写入文件 BufferedWriter bufferedWriter = null;// 用于把数据写入文件 try { if (!sourcefile.exists()) { sourcefile.createNewFile(); bufferedWriter = new BufferedWriter(new FileWriter(sourcefile)); // bufferedwriter 自动追加数据 String s = new String(" I love Java"); char bchar[] = s.toCharArray(); for (int i = 0; i < 5; i++) { // 两种方式往文件中写数据 bufferedWriter.write(bchar, 0, bchar.length); bufferedWriter.write(", " + s + "\n"); // 写完之后才能关闭流, bufferedWriter.flush(); bufferedWriter.close(); copyfile.createNewFile(); fileInputStream = new FileInputStream(sourcefile); fileOutputStream = new FileOutputStream(copyfile); byte b[] = new byte[8192]; int len = b.length; while ((len = fileInputStream.read(b, 0, len)) > 0) { fileOutputStream.write(b, 0, len); fileOutputStream.flush(); System.out.println("file copied"); fileInputStream.close(); fileOutputStream.close(); } catch (IOException e) { e.printStackTrace();执行程序,可以看到创建了一个 testcopy.txt 文件,内容为:
I love Java, I love JavaI love Java, I love JavaI love Java, I love JavaI love Java, I love JavaI love Java, I love Java
阳刚的青蛙 · 【错误记录】Windows 控制台程序编译报错 ( fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory )_无法打开源 1 周前 |
酷酷的扁豆 · 【错误记录】Windows 控制台程序编译报错 ( fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory )-阿里云开发 1 周前 |
强健的汤圆 · 对象没有存储在谷歌应用引擎数据存储中 1 年前 |