一、流概述 & InputStream、OutputStream

流包括输入流和输出流,即I/O(Input和Output),具体结构如下:

I/O类都被放在java.io包中,所有的输入流类都是InputStream(针对字节)和Reader(针对字符)两个抽象类的子类,而所有输出流都是OutputStream(针对字节)和Writer(针对字符)的子类。

InputStream是一个抽象类,它的架构如下:

                       

两个InputStream类的框架图。

InputStream类包含的API如下:

             int     available()
void close()
void mark(int readlimit)
boolean markSupported()
int read(byte[] buffer)
abstract int read()
int read(byte[] buffer, int offset, int length)
synchronized void reset()
long skip(long byteCount)

         

两个OutputStream类的框架图。

OutputStream类包含的API如下:

         void    close()
void flush()
void write(byte[] buffer, int offset, int count)
void write(byte[] buffer)
abstract void write(int oneByte)

一段程序,但有一点不太懂:

package stream;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class isos {
public static void inecho(InputStream is)
{
try
{
while(true)
{
int i=is.read();
if(i==-1)
{
break;
}
char c=(char) i;
System.out.print(c);
}
}
catch(IOException e)
{
e.printStackTrace();
}
System.out.println();
}
public static void outecho(OutputStream os)
{
try
{
String s="JAVAIO";
byte []b=s.getBytes();
os.write(b);
os.flush();
}
catch(IOException e)
{
e.printStackTrace();
}
}
public static void main(String []args)
{
inecho(System.in); //输入一行之后回显
// outecho(System.out); //输出字符串s
}
}

System.in和System.out究竟是什么类型?InputStream和OutputStream?InputStream和OutputStream不是抽象类吗?关于InputStream、OutputStream、ByteArrayInputStream和ByteArrayOutputStream先留在这里,以后再看一次看有什么新的收获没。主要重点还是放在FileInputStream和FileInputStream及其他一些知识上。

二、File类

File类创建文件对象,但是不能读写文件内容。

1.首先来看目录的创建mkdir()方法:

public class file {
public static void main(String []args) {
File dir=new File("D:/dir");
dir.mkdir();
}
}

我的电脑并没有D盘,但是这个并不会报错,没有任何变化,待挖!

如果将D盘改为E盘,则会在E盘根目录下建立名为dir的目录,再运行一次,不会有什么变化。使用mkdir之后,在使用createNewFile也不报错,但都会无效:

public class file {
public static void main(String []args) {
File dir=new File("E:/dir");
dir.mkdir(); try {
dir.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

mkdir之后的代码无效了,但是不报错。

2.之后是建立多级目录的方法mkdirs(),例如:

public class file {
public static void main(String []args) {
File dir=new File("/tmp/one/two/three");
dir.mkdirs();
}
}

有几个注意的点,第一如果不加盘符,我的默认是G盘,可能是之前设置的部分,加盘符就在前面加,例如E://tmp/one/two/three。第二多级目录使用mkdir()那就无反应,两个一起用是会建立的目录。三是使用错误的盘符,例如D盘,可以运行,但是没有建立任何目录。

3.建立子目录方法

可以直接使用建立多级目录的方法来建立子目录,例如想要建立dir的子目录aaa,可以使用

File sub1=new File("/dir/aaa");
sub1.mkdirs();

建立dir的子目录aaa,无论dir存在与否,没有就建立dir,有直接建立子目录aaa。

还可以使用

File sub1 = new File("dir", "aaa");
sub1.mkdir();

但是实验结果不是那样,失败了,以下是网上说性质,与上一种方法不同,必须要有子目录。(已解决,原因是第一个参数少加’/‘,改为File sub1 = new File("/dir", "aaa");即可)

4.新建文件方法

File f=new File("E:/test.txt");

try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}

Windows必须要使用绝对路径?像建立目录那样的使用相对路径,运行完也不报错,但是没有文件(已解决,但原因尚未清楚!)。还有创建文件必须要使用try-catch语句,而且必须是要存在的路径,否则报警告路径不存在。

        File f=new File("/dir","test.txt");

也可改为绝对路径,不过要保证该路径存在,否则直接抛出异常。

最后运行结果:

    File aa = new File("/dir");
File f=new File(aa,"/test.txt");

这两句和前面效果一样,不过也是要保证路径存在,否则抛出异常。

最后还有一种使用URI的方法,再此只标注一下,无需详细了解:

try {
URI uri = new URI("file:/home/dir");
File file4 = new File(uri);
file4.mkdirs();
URI uri2 = new URI("file:/home/dir/test.txt");
File f2=new File(uri2);
f2.createNewFile(); } catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

5.File的一些API使用

boolean    canExecute()    // 测试应用程序是否可以执行此抽象路径名表示的文件。
boolean canRead() // 测试应用程序是否可以读取此抽象路径名表示的文件。
boolean canWrite() // 测试应用程序是否可以修改此抽象路径名表示的文件。
boolean delete() // 删除此抽象路径名表示的文件或目录。
boolean equals(Object obj) // 测试此抽象路径名与给定对象是否相等。
boolean exists() // 测试此抽象路径名表示的文件或目录是否存在。
File getAbsoluteFile() // 返回此抽象路径名的绝对路径名形式。
String getAbsolutePath() // 返回此抽象路径名的绝对路径名字符串。
File getCanonicalFile() // 返回此抽象路径名的规范形式。
String getCanonicalPath() // 返回此抽象路径名的规范路径名字符串。
long getFreeSpace() // 返回此抽象路径名指定的分区中未分配的字节数。
String getName() // 返回由此抽象路径名表示的文件或目录的名称。
String getParent() // 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
File getParentFile() // 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
String getPath() // 将此抽象路径名转换为一个路径名字符串。
long getTotalSpace() // 返回此抽象路径名指定的分区大小。
long getUsableSpace() // 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
int hashCode() // 计算此抽象路径名的哈希码。
boolean isAbsolute() // 测试此抽象路径名是否为绝对路径名。
boolean isDirectory() // 测试此抽象路径名表示的文件是否是一个目录。
boolean isFile() // 测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden() // 测试此抽象路径名指定的文件是否是一个隐藏文件。
long lastModified() // 返回此抽象路径名表示的文件最后一次被修改的时间。
long length() // 返回由此抽象路径名表示的文件的长度。
String[] list() // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
String[] list(FilenameFilter filter) // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles() // 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter) // 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FilenameFilter filter) // 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
static File[] listRoots() // 列出可用的文件系统根。
boolean renameTo(File dest) // 重新命名此抽象路径名表示的文件。
boolean setReadOnly() // 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
String toString() // 返回此抽象路径名的路径名字符串。 
    String name=f2.getName();
long length=f2.length();
String path=f2.getPath();
String parent=f2.getParent();
String p2=f2.getAbsolutePath();
String p3=f2.getCanonicalPath();
long fs=f2.getFreeSpace();
long ts=f2.getTotalSpace();
long us=f2.getUsableSpace();
boolean b1=f2.exists();
boolean b2=f2.canWrite();
boolean b3=f2.canExecute();
boolean b4=f2.canRead();
System.out.print(name+" "+length+" "+b1+" "+b2+" "+b3+" "+b4);
System.out.println();
System.out.print(path+" "+parent+" "+p2+" "+p3+" "+fs+" "+ts+" "+us);
System.out.println();
long time=f2.lastModified();
boolean b5=f2.isDirectory();
boolean b6=f2.isFile();
boolean b7=f2.isHidden();
boolean b8=f2.isAbsolute();
// for(String s:f2.list())
// System.out.println(s);
System.out.print(b5+" "+b6+" "+b7+" "+b8+" "+time);
结果:

test.txt 7 true true true true
\home\dir\test.txt \home\dir G:\home\dir\test.txt G:\home\dir\test.txt 89270075392 107666731008 89270075392
false true false false 1545665029004

注:经过简单测试,汉字length为2,回车length为2。

而之前对f2使用list方法出现错误,一直抛出空指针的异常,后来发现这个方法会返回该目录下的所有目录和文件的名称,但是你的对象是一个文件的话,那就会抛出异常了,也就是说你的对象要首先是一个目录,才能调用该方法:

    String []list=file4.list();
for(String s:list)
System.out.println(s);

结果:

sub(目录)
test.txt(文件)

三、FileInputStream & FileInputStream

FileInputStream输入,对应文件的读操作(Read)。

FileOutputStream输出,对应文件的写操作(Write)

package stream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class FileStream {
public static void main(String []args)
{
try {
FileOutputStream fos=new FileOutputStream("G:\\home\\dir\\test.txt");
byte[] bb="武一鸣".getBytes();
fos.write(bb);
     fos.write(33); //FileInputStream写入write参数可以是byte[]或者int,但是int也会变成byte 33变为!,但经过实测char好像也可以
fos.close();
FileInputStream fis=new FileInputStream("G:\\home\\dir\\test.txt");
int i=fis.read();
while(i!=-1)
{
byte b=(byte) i;
System.out.print((char)b);
i=fis.read(); //注意不要忘记,刚开始写代码这句忘了,一直无限循环。
}
fis.close(); } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

结果分析:FileOutputStream写入会使之前的文件信息全部消失。

其实这里应该详细讲解InputStream和OutpStream的方法的,例如write()、flush()、read()、mark()等等,但是由于种种原因已到了BufferedInpuStream后面讲了,移步到Java I/O(二)。

Java I/O(一)流和文件类File的概述、FileInputStream和FileInputStream的更多相关文章

  1. JAVA通过I/O流复制文件

    JAVA通过I/O流复制文件 本文是对字节流操作,可以多音频视频文件进行操作,亲测有效. 个人感觉这个东西就是靠记的, 没什么好解释的,,,, import java.io.File; import ...

  2. 文件类File

    文件类File继承结构: public class File extends Object implements Serializable, Comparable<File> 常用方法: ...

  3. Java基础 使用转换流进行文件的复制 / RandomAccessFile 类进行文件的复制

    笔记:  **使用转换流进行文件的复制 文本文件---字节流FileInputStream--> [InputStreamReader] -----字符流BufferedReader------ ...

  4. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  5. Java:文件类File的详解

    File类的常用方法: 1.创建     boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立创建文件,而 ...

  6. java 学习笔记之 流、文件的操作

    ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...

  7. Java输入输出流(IO)-----文件类File详解

       1.java.io.File类简介 凡是与输入.输出相关的类.接口等都定义在java.io包下 File是一个类,可以有构造器创建其对象.此对象对应着一个文件(.txt .avi .doc .p ...

  8. Java中常用IO流之文件流的基本使用姿势

    所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流. ...

  9. java 21 - 4 字符流的文件复制操作以及简化

    既然字节流可以复制文件,那么字符流当然也有. 同样的思路: 数据源: a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader目的地: b.txt -- 写出数据 -- ...

随机推荐

  1. SecureCRT配置华为S5700交换机

    我准备从交换机中监控某台设备的流量,所以要配置交换机的某个口作为镜像口,用来下载另外一个指定端口的流量. 第一步:华为5700交换机 简而言之网口部分除了最后四个都是用来连接下级网络设备的,最后四个端 ...

  2. photoshop人物美白教程:暗沉肤色提亮美白

    内容提要:本篇photoshop人物美白教程的制作方法主要通过提取高光选区,配合滤色模式进行人物美白. ps美白教程在网络上搜索,会找到很多.本文介绍的PS人物美白方法,笔者看来是比较好的一种,主要是 ...

  3. FastAdmin-T

    FastAdmin 注意食用姿势,建议先通读官方文档一次,在看 根据环境及配置的不同,仅作参考 修改mysql表注释ALTER TABLE student COMMENT '学生表'; fastadm ...

  4. PJzhang:国外主流站点钓鱼网站示例工具shellphish

    猫宁!!! 参考链接:https://www.uedbox.com/post/58583/ 这个是这个项目的github地址 https://github.com/thelinuxchoice/she ...

  5. 实现文件上传功能(FileUpload组件)

    文件上传: 项目中经常用到文件上传. 自己实现文件上传,使用文件上传组件fileupload组件 1.指定表单类型为文件上传, enctype=”multipart/form-data” 2.提交方式 ...

  6. OpenStack组件——cinder存储服务

    1.cinder 介绍 1)理解 Block Storage 操作系统获得存储空间的方式一般有两种: (1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文 ...

  7. Linux C/C++基础——二级指针做形参

    1.二级指针做形参 #include<stdio.h> #include<stdlib.h> void fun(int **temp) { *temp=(int*)malloc ...

  8. js ajax跨域被阻止 CORS 头缺少 'Access-Control-Allow-Origin'(转)

    今天ajax请求域名的时候出现 已阻止跨源请求:同源策略禁止读取位于 http://www.zuimeimami.com*****的远程资源.(原因:CORS 头缺少 'Access-Control- ...

  9. Java中对比单继承与多继承的优劣,以及java的解决方案

    继承是一种面相对象的基本特征之一,但在具体语言的语法设计中有两种方式:单继承和多继承. 所谓多继承是指一个子类可以拥有多个父类:单继承则是一个子类只拥有一个父类. 单继承与多继承的优劣: 多继承优点在 ...

  10. cm日志的清理

    #过一段时间后,cm server的空间越来越大 #删除日志/bin/rm /var/lib/cloudera-host-monitor/ts/*/partition*/* -rf/bin/rm /v ...