java中,DataInputStream和 FileInputStream有啥区别和联系?怎么转换?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中,DataInputStream和 FileInputStream有啥区别和联系?怎么转换?相关的知识,希望对你有一定的参考价值。

DataInputStream input=new DataInputStream(new BufferedInputStream(new FileInputStream("Data.txt")));

可以简写为
DataInputStream =new DataInputStream(new fileInputStream("dataout.txt"));
吗?

    不可以简写,要有编码规范。

    DataInputStream是数据输入流,读取的是java的基本数据类型。

    FileInputStream是从文件系统中,读取的单位是字节。

追问

“读取的是java的基本数据类型”
“读取的单位是字节”
可以具体讲讲么,不是很明白\(^o^)/~

追答

java的基本数据类型,整型 浮点型 布尔型这些东西都可以识别,但是对文件就不可以。
读取的单位是字节,是因为他面向的是文件,它不管他要读取的东西是什么数据类型,统统以之为文件的形式,然后按照字节为单位,一个字节一个字节的读取。
所以,你再细想一下,如果要读取的文件是数据类型,可以把它当作文件来读取,但是如果文件不是数据类型,就不能把数据类型当作文件来读取。再通俗点儿说,可以把西瓜当成水果,但是水果并不是西瓜。我能吃水果,就一定能吃西瓜,但是,如果我只能吃西瓜,却不一定能吃水果,这是集合论中的一点儿思想,你细心体会一下下哦。。。

参考技术A DataInputStream(简称Data)和FileInputStream(简称File)两者都是inputStream的子类,但是他们的父类不同,Data的父类是FilterInputStream,而File的父类是inputStream,形象一点也就是说,Data的爷爷才是File的爸爸,File中的方法针对读取文件,并把文件的字符内容以数据流的形式读取到内存中便于进行进一步处理,这个过程中涉及到流的封装,例如:DataInputStream in = new DataInputStream(new FileInputStream( "Java2s.txt"));使用File来加载一个文件,然后使用Data对File进行封装。 参考技术B 都是输入流,正确的写法:
DataInputStream dis = new DataInputStream( new FileInputStream("Data.txt")).
你可以看下jdk api,里面写的很详细
参考技术C DataInputStream继承(extends)FileInputStream implements DataInput,从FileInputStream中继承了in字段;
FilterInputStream 继承InputStream类 FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。
DataInputStream 继承FilterInputStream类 DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
InputStream 此抽象类是表示字节输入流的所有类的超类。DataInputStream =new DataInputStream(new fileInputStream("dataout.txt"));不会出现编译问题,但是建议不要简写。

Java中DataInputStream的用法

我要用到DataInputStream从控制台读取一个数据(Java的基本数据类型)然后让它去做算术运算。请问怎么实现。注:用readInt()等方法直接读取的话好像行不通我写了一段代码如下(这只是测试代码):import java.io.*;public class Test public static void main(String[] args) DataInputStream dis=new DataInputStream(System.in); long a=0; try a=readLong(); catch(IOException e) e.printStackTrace(); System.out.println(a); 输入12时 输出的结果是 825362957为什么输入与输出不同?

1、DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后应用程序可以使用数据输入流将数据读入。

2、例子:

/** 
 * 必须先使用DataOutputStream写入数据,然后使用DataInputStream读取数据方可。 
 *  
 * @author 徐越 
 *  
 */  
public class TestClass  
  
    public static void main(String[] args) throws Exception  
      
        TestClass t = new TestClass();  
        t.write();  
        t.read();  
      
  
    public void write() throws Exception  
      
        String path = this.getClass().getClassLoader().getResource("test.txt").toURI().getPath();  
        OutputStream os = new FileOutputStream(path);  
        DataOutputStream dos = new DataOutputStream(os);  
        dos.writeDouble(Math.random());  
        dos.writeBoolean(true);  
        dos.writeInt(1000);  
        dos.writeInt(2000);  
        dos.flush();  
        os.close();  
        dos.close();  
      
  
    public void read() throws Exception  
      
        InputStream instream = this.getClass().getClassLoader().getResourceAsStream("test.txt");  
        DataInputStream dis = new DataInputStream(instream);  
        double d = dis.readDouble();  
        boolean b = dis.readBoolean();  
        // 先写的先被读出来  
        int i1 = dis.readInt();  
        int i2 = dis.readInt();  
        instream.close();  
        dis.close();  
        System.out.println(d);  
        System.out.println(b);  
        System.out.println(i1);  
        System.out.println(i2);  
      

输出结果

0.4683893857027681
true
1000
2000

参考技术A DataInputStream是字节流,每次读的时候是按二进制的形式读取....既然是控制台程序。。就用Scanner。。那样输入就一样了、、 参考技术B 楼主我写了一个提取数据,然后保存的代码,你要的是这个意思嘛,参考一下吧
public
static
void
main(String[]
args)
throws
Exception
DataInputStream
dis=new
DataInputStream(new
FileInputStream("d:\\sql.txt"));
File
file=new
File("d:\\sql.txt");
byte[]
bytes=new
byte[(int)file.length()];
dis.read(bytes);
DataOutputStream
dos=new
DataOutputStream(new
FileOutputStream("d:\\kakabak.txt"));
dos.write(bytes);
dos.flush();
dos.close();
dis.close();
参考技术C import java.io.DataInputStream;
import java.io.IOException;public class mains /**
* @param args
*/

public static void main(String[] args)

DataInputStream dis=new DataInputStream(System.in);

String num1="";
String num2="";

try
System.out.println("请输入第一个数字");

num1 = dis.readLine();
System.out.println("请输入第二个数字");
num2 = dis.readLine();
System.out.println("num1+num2="+(Integer.parseInt(num1)+Integer.parseInt(num2)));
System.out.println("num1*num2="+(Integer.parseInt(num1)*Integer.parseInt(num2)));
System.out.println("num1/num2="+(Integer.parseInt(num1)/Integer.parseInt(num2)));
System.out.println("num1-num2="+(Integer.parseInt(num1)-Integer.parseInt(num2)));
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();


看看测试结果
参考技术D 为什么不用Scanner呢?DataInputStream好像是输入流吧

以上是关于java中,DataInputStream和 FileInputStream有啥区别和联系?怎么转换?的主要内容,如果未能解决你的问题,请参考以下文章

大数据必学Java基础(七十三):数据流DataInputStream和DataOutputStream介绍

JAVA IO操作:数据操作流:DataOutputStream和DataInputStream

InputStream和outputStream

Java IO DataInputStream 和 DataOutputStream

JAVA DataOutputStream和DataInputStream

Java GzipInputStream 转换为 DataInputStream