No.10 输入输出流

Java中的流分为两种分别由四个抽象类来表示:
一、字节流  InputStream  OutputStream
二、字符流   Reader,Writer









在这四个抽象类中,InputStream和Reader定义了完全相同的接口:

int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)



  而OutputStream和Writer也是如此:

int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)



  这六个方法都是最基本的,read()和write()通过方法的重载来读写一个字节,或者一个字节数组。

import java.io.*;

      public class IOStreamDemo {

            public void samples() throws IOException {

                 //1. 这是从键盘读入一行数据,返回的是一个字符串
                 BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
                 System.out.print("Enter a line:");
                 System.out.println(stdin.readLine());

                 //2. 这是从文件中逐行读入数据

                 BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
                 String s, s2 = new String();
                 while((s = in.readLine())!= null)
                            s2 += s + "\n";
                 in.close();

                 //3. 这是从一个字符串中逐个读入字节
                 StringReader in1 = new StringReader(s2);
                 int c;
                 while((c = in1.read()) != -1)
                            System.out.print((char)c);

                 //4. 这是将一个字符串写入文件
                 try {
                            BufferedReader in2 = new BufferedReader(new StringReader(s2));
                            PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
                            int lineCount = 1;
                            while((s = in2.readLine()) != null )
                                       out1.println(lineCount++ + ": " + s);
                            out1.close();
                 } catch(EOFException e) {
                            System.err.println("End of stream");
                 }
            }
      } 


对于上面的例子,需要说明的有以下几点:

  1. BufferedReader是Reader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:

BufferedReader(Reader in)
BufferedReader(Reader in, int sz)



  这里的sz是指定缓冲区的大小
 2. InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给             BufferedReader使用。

  3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

  这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以最内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter来包装它以达到目的,最后,我们需要格式化输出结果,于是将PrintWriter包在最外层。

  Java提供了这样一个功能,将标准的输入输出流转向,也就是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:

引用
import java.io.*;

public class Redirecting {

       public static void main(String[] args) throws IOException {
              PrintStream console = System.out;
              BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java"));
              PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out")));
              System.setIn(in);
              System.setOut(out);

              BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
              String s;
              while((s = br.readLine()) != null)
                     System.out.println(s);
              out.close();
              System.setOut(console);
      }
}



  在这里java.lang.System的静态方法

static void setIn(InputStream in)
static void setOut(PrintStream out)



  提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你就可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,就直观了许多。

  Java流有着另一个重要的用途,那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。

  在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

  所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

import java.io.*;
import java.util.*;

public class Logon implements Serializable {

       private Date date = new Date();
       private String username;
       private transient String password;


       Logon(String name, String pwd) {
              username = name;
              password = pwd;
       }


       public String toString() {
              String pwd = (password == null) ? "(n/a)" : password;
              return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;
       }


       public static void main(String[] args) throws IOException, ClassNotFoundException {
              Logon a = new Logon("Morgan", "morgan83");
              System.out.println( "logon a = " + a);
              ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));
              o.writeObject(a);
              o.close();

              int seconds = 5;
              long t = System.currentTimeMillis() + seconds * 1000;
              while(System.currentTimeMillis() < t) ;

              ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));
              System.out.println( "Recovering object at " + new Date());
              a = (Logon)in.readObject();
              System.out.println("logon a = " + a);
       }
}



  类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

  需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝






 

c++课程实验输入输出流 c++课程实验 输入输出流 自己写的,有需要的童鞋欢迎拿去 立即下载

相关推荐

Python地理空间数据库之geopandas使用详解

地理空间数据分析在许多领域中都有着广泛的应用,包括地理信息系统(GIS)、城市规划、环境科学、地质勘探等。Python GeoPandas是一个强大的库,旨在简化地理空间数据的处理和分析。本文将深入介绍GeoPandas库,包括其基本概念、功能特性、示例代码以及在实际应用中的应用场景。

Rocky006的博客 1万+

java之io类,输入输出流学习

io流,流是一个抽象的概念,当java程序需要从数据源读数据时,会开启一个到数据源的流从文件,内存,或者网络中把数据输出到控制台。 更方便的处理数据的输入输出。 流分为字节流和字符流。字节流由inputstream和outputstream处理,而字符流由reader和writer处理, InputStream提供的最重要的方法是 read(); read(byte[

我不做黑马,就是走在做黑马的路上 567

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3112

java编程d系统_详细解读Java编程中的IO系统

您可能感兴趣的话题:Java核心提示:stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。一. Input和Output1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:1.1 以字节为导向的stream以字节为导向的stream,表示以字节...

weixin_36054159的博客 152

【实战】ESP32 + LN298N 实现电动推杆的闭环位置伺服控制

本文详细介绍了如何使用ESP32微控制器和LN298N电机驱动模块,为普通电动推杆增加编码器反馈,实现精准的闭环位置伺服控制。文章从硬件选型与接线讲起,深入解析了编码器四倍频计数原理与位置换算,并重点阐述了PID控制算法的核心思想、代码实现及参数整定方法,旨在帮助读者从零构建一个反应迅速、定位精准的智能执行器系统。

weixin_29195615的博客 317

ESP32之 ESP-IDF + Clion 开发环境搭建(二)—— Linux版

本文介绍了 Linux 下,使用Clion IDE 用官方 ESP-IDF 开发包进行 ESP32 开发的环境搭建

Augtons 的博客 6097

Java中的输入输出总结

Java中的输入输出总结

XQF 4289

钉钉多维表格开发

从0到1完成钉钉多维表格开发SDK对接与实践案例。

沉修所长,勇逐新机;安而不怠,静而思变 3606

实验八 输入输出流(二)

内容2:文本文件的读、写 (1) 新建一个工程demo2,设计一个类Student,其成员变量包括学号(no)、姓名(name)、性别(sex)、专业(major)、联系方式(phone)和地址(addr)。 (2) 为类Student定义成员函数writeTo,实现从给定文本文件中读取学生数据,接口如下: void writeTo (char filename[ ]); (3) 为类St...

陈风的博客 4068

基于Python的虚拟货币社区情绪分析与市场价格预测爬虫实现

本文探讨了如何利用Python爬虫技术获取虚拟货币社区数据,并通过情感分析预测市场价格走势。我们将使用最新的异步爬虫框架、自然语言处理技术和机器学习模型,构建一个完整的社区情绪分析系统。本文提供了详细的代码实现和理论解释,适合作为毕业设计参考。关键词:Python爬虫、虚拟货币、情感分析、价格预测、异步爬虫、机器学习爬虫框架aiohttp和httpx用于异步HTTP请求HTML解析和parsel数据存储MongoDB和Pandas用于数据处理自然语言处理库和VADER情感分析工具机器学习和。

2201_76125261的博客 521

PCL 加权局部最优投影(WLOP)简化算法

WLOP算法是一种点云重采样方法,通过迭代优化实现点云均匀化和特征保留。算法包含数据项(加权平均位置保持几何特征)和正则化项(排斥邻近点实现均匀分布)两部分。代码实现基于PCL库,通过KD树加速邻域搜索,使用高斯权重函数计算点位置更新。参数包括输出点比例、邻域半径、正则化权重和迭代次数。该算法不依赖网格信息,适合处理大规模扫描数据的预处理优化。

点云侠的博客 628

C++核心编程 day09 类型转换、异常、输入输出流

类型转换、异常语法、C++标准异常库、输入输出流概念以及流类库、标准输入流、标准输出流、文件读写

月仙儿的博客 331

【异常】OpenClaw网关仪表盘 pairing required 报错排查与解决方案

在OpenClaw网关仪表盘页面,完成WebSocket URL、网关令牌等必填项配置后,点击「连接」按钮尝试建立网关连接时,页面下方出现红色报错提示框,核心报错内容为,无法完成网关连接建立,且该报错在令牌配置正确、网络链路通畅的场景下仍会触发。该报错常见于非本地回环地址的访问场景,包括局域网远程访问、公网域名/IP访问、云服务器部署的网关远程管理等场景,本地127.0.0.1回环地址访问通常可正常连接。

奶爸的编程之路,也就一周冷个三天 1077

Java程序设计实验五 输入输出流

Java程序设计实验五 输入输出流 实验内容: 1. 实验方案:创建一个文件,向其中写入字符并保存读取,完成实验任务。 2. 实验步骤:创建一个“song.txt”文件并向其中添加初始信息,用字节流和字符流,向文件中添加歌曲信息,并选择打开文件检验是否有遗漏,不断调试直至试验结束。 3. 设计思路: 创建一个主类,在主类中完成文件的创建以及是否选择写入和读取,通过文件字节输入流将文件中的信息显示在命令行中,再次通过文件字节/字符输出流将定义的信息存入文件中,并且通过文件字符输入流再次显示在命令行中。

萌新程序猿的博客 2107

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

命名空间,输入输出流,为什么支持重载,缺省,指针与引用

C++入门知识在我们学习了C语言后,我们开始了C++的学习,而学习C++的第一节课,我们需要知道C++一些不同于C语言的基本特点: 例如: 1:命名空间在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名

lrving_j的博客 362

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C++】标准输入输出流和文件读写

本篇文章讲到标准输入流,标准输出流,文件读写。提示:以下是本篇文章正文内容,下面案例可供参考。

2301_80035097的博客 959

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

输入输出流

文件IO和标准输入输出 键盘输入输出叫标准输入输出 文件的输入输出叫文件I/O 一般过程是键盘输入到输入缓冲区,到程序到输出缓冲区,输出缓冲区到显示器 缓冲区 输入缓冲区,本质上就是一块内存,键盘输入到这块内存 输出缓冲区,程序输出到缓冲区,缓冲区输出到显示器显示,endl会输出换行并且立即刷新缓冲区,代码cout<<“hello world”;在Linux下不会输出,必须加endl才会输出 <iostream>中cerr没有缓冲区直接输出到显示器,clog有缓冲区,通过缓冲区

Mr_Csyn的博客 381

【C++干货基地】C++入门篇:输入输出流 | 缺省函数 | 函数重载(文末送书)

C++ 的新世界究竟是什么样子呢?今天来就来让我们来开启新世界的航海旅行吧!

鸽芷咕的博客 6388

fatal error C1083 Cannot open include file 'iostream.h' No such file or directory 的解决方法

VC++6.0 中的一段程序,有用到iostream.h中的标准输入输出流,直接用 VS2005编译器编译的时候报错“Cannot open include file: 'iostream.h': No such file or directory”。 旧的源文件如下: #include int main() { :cout

社福之路——专栏 4234

C++ 标准输入输出流

标准输入流 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; /* cin.get() //一次只能读取一个字符 cin.get(一个参数) //读一个字符 cin.get(三个参数) //可以读字符串 cin.getline() cin.ignore() cin.putback()...

Ai_King的博客 345

一文带你从C快速过渡到C++

从C快速过度到C++!如果你学习过C语言,想要快速学会C++,不想重头开始看视频,那么该篇文章应该能帮助到您。

Dakhin的博客 1万+

8.1 C++ 标准输入输出流

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

微软技术分享 7825

手撕C++入门基础

C++课程包括:C++语法、STL、高阶数据结构C++兼容之前学习的C语言打印hello world在这个代码中我们有很多地方不清楚头文件 #includemain函数上面的代码:using namespace std;打印hello world的代码:cout

2301_80863610的博客 8513

ZOJ 2850: Beautiful Meadow

ZOJ - 2850 ///@author Sycamore, ZJNU ///@accepted_on 2017-01-19 #include<iostream> using namespace std; bool bl[10][10]; int main() { short M, N; while (cin >> M >&gt...

weixin_30673715的博客 109

fatal error C1083: 无法打开包含文件:“iostream.h”: No such file or directory

iostream.h已经不被.net支持了,你要用的话加上using namespace std; #include "stdafx.h" #includeiostream.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout<<"hello"<<endl; return 0; } 另外: 转自:ht

JayChou2016 2209

1090:含k个3的数

【题目描述】 输入两个正整数m和k,其中1 < m < 100000,1 < k < 5 ,判断m能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 例如,输入:43833 3,满足条件,输出YES。如果输入:39331 3,尽管有3个3,但不能被19整除,也不满足条件,应输出NO。带我去看题目 【输入】 m 和 k 的值,中间用单个空格间隔。 【输出】 满足条件时输出 YES,不满足时输出 NO。 【输入样例】 43833 .

Stark_Kylin的博客 578
上一篇: No.8 集合
下一篇: No.10.1 java控制台输入
afunti
博客等级 码龄17年 25粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值