北京 [ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

学了2年Java,在北京根本收不到offer,面试官:IO流操作都不会

北京

今日分享开始啦,请大家多多指教~

这篇文章给大家讲述了IO流,在java数据中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输。

一、前言

Java的I/O主要的用途就是文件数据的读写、数据的网络发送与接收等场合。

根据数据传输特性将流抽象为各种类,方便更直观地进行数据操作。对于文件内容的操作主要分为两大类分别是:字符流和字节流。

二、I/O流的分类

根据处理数据类型的不同分为:字符流和字节流。

根据数据流向不同分为:输入流和输出流。

1、字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

  1. 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  2. 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
  3. 字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

2、输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

三、代码实例

1、字节流读操作

package com.guor.javaSE; 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; 
public class IOTest { 
    public static void main(String[] args) {
        test05();
    } 
    private static final String const_filePath = "D:\\guor\\data\\test.txt";
    private static final String const_filePathChinese = "D:\\guor\\data\\中文.txt";
    private File const_file = null;
    private File const_fileChinese = null;
 
    public IOTest() {
        this.const_file = new File(const_filePath);
        this.const_fileChinese = new File(const_filePathChinese);
    }
    /**
     * 字节流读取文件:单个字符读取
     * @param b_chinese_file
     */
    private static void test01(boolean b_chinese_file) {
        IOTest ioTest = new IOTest();
        FileInputStream fis = null;
        try {
            if(true == b_chinese_file) {
                //测试字节流读取中文乱码问题
                fis = new FileInputStream(ioTest.const_fileChinese);
            }else {
                fis = new FileInputStream(ioTest.const_file);
            }
            int read = 0;
            while ((read = fis.read())!=-1) {
                log((char)read, false);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    } 
    /**
     * 字节流读取文件:数组循环读取
     */
    private static byte[] test02() {
        IOTest ioTest = new IOTest();
        FileInputStream fis = null;
        int len = 512;
        byte[] buffer = new byte[len];
        try {
            fis = new FileInputStream(ioTest.const_file);
            int read;
            while ((read = fis.read(buffer,0,len)) != -1) {
                log(buffer + "", true, false);
            }
            for(byte b : buffer) {
                if(true == Character.isLetterOrDigit((char)b) || (char)b == "\n") {
                    log((char)b, false, false);
                }
            }
        } catch (FileNotFoundException e) {
            return new byte[1];
        } catch (IOException e) {
            return new byte[1];
        } finally {
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return buffer;
    }
}

2、字符流读操作

学了2年Java,在北京根本收不到offer,面试官:IO流操作都不会

3、字节流写操作

/**
 * 字节流写操作
 * @throws IOException
 * @throws FileNotFoundException
 */
private static void test04() {
    String outPath = "D:\\guor\\data\\testNew.txt";
    FileOutputStream fos = null;
    try {
        File file = new File(outPath);
        byte[] buffer = test02();
        fos = new FileOutputStream(file);
        fos.write(buffer);
    } catch (FileNotFoundException e) {
        log("FileNotFoundException: " + e);
    } catch (IOException e) {
        log("IOException: " + e);
    } finally {
        if(fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4、字符流写操作

/**
 * 字符流写操作
 * @throws IOException
 * @throws FileNotFoundException
 */
private static void test05() {
    String outPath = "D:\\guor\\data\\中文New.txt";
    IOTest ioTest = new IOTest();
    FileReader fr = null;
    FileWriter fw = null;
    try {
        fr = new FileReader(ioTest.const_fileChinese);
        StringBuilder sb = new StringBuilder();
 
        int read = 0;
        while ((read = fr.read()) != -1) {
            log((char)read, false);
            sb.append((char)read);
        }
 
        File file = new File(outPath);
        fw = new FileWriter(file);
        fw.write(sb.toString());
    } catch (FileNotFoundException e) {
        log("FileNotFoundException: " + e);
    } catch (IOException e) {
        log("IOException: " + e);
    } finally {
        if(fw != null) {
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(fr != null) {
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

5、log日志打印

/**
 * @param msg 带输出信息
 * @param b_wrap 是否换行
 */
private static void log(Object msg, boolean b_wrap) {
    if(true == b_wrap) {
        System.out.println(msg + "");
    }else {
        System.out.print(msg + "");
    }
}
 
/**
 * @param msg
 */
private static void log(Object msg) {
    log(msg, true, true);
}
 
/**
 * @param msg 带输出信息
 * @param b_wrap 是否换行
 * @param out 是否输出
 */
private static void log(Object msg, boolean b_wrap, boolean out) {
    if(true == out) {
        if(true == b_wrap) {
            System.out.println(msg + "");
        }else {
            System.out.print(msg + "");
        }
    }
}

四、多线程方式进行socket文件传送

socket通信时用socket.getOutputStream();获取输入输出流,不是socket通信时用new FileOutPutStream()获取输入输出流。

1、服务端

学了2年Java,在北京根本收不到offer,面试官:IO流操作都不会

2、服务端Thread

public class MyDownload implements Runnable{
    private Socket socket;
 
    public MyDownload(Socket socket) {
        this.socket = socket;
    }
 
    @Override
    public void run() {
        try{
            System.out.println("与客户端连接成功");
            //服务端向客户端发送消息
            OutputStream out = socket.getOutputStream();
            File file = new File("H:\\js\\jquery-2.1.4.min.js");
            //将此文件从硬盘读到内存中
            InputStream in = new FileInputStream(file);
            //定义每次发送的文件大小
            byte[] bytes = new byte[1000];
            int len = -1;
            while ((len = in.read(bytes)) != -1){
                out.write(bytes,0,len);
            }
            in.close();
            out.close();
            socket.close();
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

3、客户端

学了2年Java,在北京根本收不到offer,面试官:IO流操作都不会

4、控制台输出

学了2年Java,在北京根本收不到offer,面试官:IO流操作都不会

五、图片与byte数组互转

public class Image2ByteTest {
    public static void main(String[] args) {
        String path = "D:\\guor\\CSDN\\1.jpg";
        byte[] image2byte = image2byte(path);
        System.out.println(image2byte);
        String path2 = "D:\\guor\\CSDN\\2.jpg";
        byte2image(image2byte,path2);
    }
 
    // 图片到byte数组
    public static byte[] image2byte(String path) {
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();
        } catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        } catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }
 
    // byte数组到图片
    public static void byte2image(byte[] data, String path) {
        if (data.length < 3 || path.equals(""))
            return;
        try {
            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
            imageOutput.write(data, 0, data.length);
            imageOutput.close();
            System.out.println("Make Picture success,Please find image in " + path);
        } catch (Exception ex) {
            System.out.println("Exception: " + ex);
            ex.printStackTrace();
        }
    }
 
    // byte数组到16进制字符串
    public String byte2string(byte[] data) {
        if (data == null || data.length <= 1)
            return "0x";
        if (data.length > 200000)
            return "0x";
        StringB

相关内容

“病宝宝”插画发酵,设计师吴勇身份曝光:清美毕业生,实力强劲

本文内容来自于网络,若与实际情况不相符或存在侵权行为,请联系删除。吴勇和吴勇工作室最近登上热搜:数学教材2013年人民教育版人物插画,特色面孔和面部表情看起来又歪又歪,很奇怪,不是正常孩子该有的样子。乍一看,他确实有唐氏综合症的迹象!课本插···

德国动画设计专业留学攻略及院校介绍

近年动画一直处于一个上升期,不论是观众的接受度还是动画市场的大环境都处在一个良好的状态,越来越多的同学想加入动画设计行业并出国深造。我就是其中一个,从大一开始就开始想去德国读动画设计专业,也是那会开始开始学习德语,在网上联系了高凡的老师,老···

脑机接口:人工智能下一站?

随着人工智能的发展,脑机接口也逐渐从科幻走进现实。有人希望以此造就“超人”,更多的人则希望能够解决实际问题——让盲人复明、让瘫痪在床的患者重新走路、让阿尔兹海默症患者找回曾经的记忆……但也有人持有怀疑态度:脑机接口会不会让别人控制自己的大脑···

AI人进军畜牧业,用人工智能技术给二师兄量体温

#头条创作挑战赛#本文来自35斗公众号,作者陈欣雨。作为时下科技的前沿技术,人工智能已经渗入到各行各业之中。当下,人工智能已为工业生产、医疗服务、智慧生活等带来一系列可喜的变化,其在农业中的应用也逐渐趋于成熟。在信息科技不断发展的今天,将先···

号称学三天就接单 商业插画班究竟有多坑

“学完就能接单!”“开启第二副业!”近日,记者从多个平台发现,信息流广告开始推荐大量配音、插画等泛职业培训类课程。以插画课为例,宣传课程的机构往往先用低价体验课吸引受众,然后在学员上过几节直播课后推销大容量课包,并承诺可提供接单服务,吸引学···

大学生参加嵌入式培训班好就业吗?

嵌入式系统可以说是当前热门、有发展前景的IT应用领域之一,包括手机、电子字典、可视电话、数字相机、数字摄像机、机顶盒、智能玩具医疗仪器和航空航天设备等都是典型的嵌入式系统,国内的嵌入式人才极度匮乏,据权威部门统计,我国目前嵌入式软件人才缺口···

嵌入式培训机构要不要去?

嵌入式培训机构要不要去?适合谁去大部分的新人、毕业生或者想转行到互联网行业的人群,面临的第一个迷茫就是选择入门的途径问题。这个话题以前也有写过,因为后续来了很多新的小伙伴,加上现在又是特殊时期,正是学习的好时候,那么今天再来谈下。一、培训机···

参加嵌入式软件开发培训的费用贵吗?

  目前it行业的迅速发展,大家也都是看在眼里,大部分的人都打算从事软件开发方向,可是说起来也不是那么容易啊,没有足够的经验,没有一点行业基础,这也是做白日梦啊?那么如果说你想找一个最快捷的途径的话,那就是参加it培训,培训对于毫无经验的人···

计算机专家“破圈”,点亮青少年科学梦想;国产数据库开拓者阳振坤走进中学科堂,普及计算机知识

“电脑为什么叫计算机?”“远在天边的卫星,如何为地球上的汽车、高铁、飞机导航?”“十进制与二进制有啥区别?”……6月2日,CCF会士、国产分布式数据库OceanBase首席科学家阳振坤,走进吕梁市临县四中,为118名初一学生上了一堂精彩纷呈···

北京UI设计培训 开课吧UXD全栈培训带你入行

未来,是体验经济的时代,用户的个性化体验将更为重要,且充满价值。优秀UI设计师不仅能赋予产品生活与质感,同时,也是品牌深入人心的灵魂所在。当今UI设计行业从新鲜便成了热度,带动了一批年轻人转行,其中不乏大批零基础新手入行。转行并非易事,想在···

如何选择一家靠谱的ui设计培训机构

毕业季马上到了,更多的人投入到找工作的大军中,有些人想从事UIUE方面的工作,但是可能自己没有太多的经验,专业技能方面也有所欠缺,所以可能会选择去专业的培训机构学习,但是现在培训机构遍地开花,师资力量也参差不齐,笔者目前从事UI设计工作,看···

北京UI设计培训哪里好

UI设计是一个很有前途和钱途的行业,越来越多的人加入到UI设计学习培训当中,以求自己获得技术上的提升。面对那么多的UI设计培训机构,让大部分的学员无从选择。北京UI设计培训哪里好?北京渥瑞达UI设计培训专家告诉大家。首先选择自己感兴趣的机构···

2022年度中国十大室内设计品牌企业揭晓暨室内设计TOP100榜单发布

“建筑中国最具品牌影响力”评选活动是由中国建筑行业最具影响力的权威门户ARCHINA建筑中国联合建筑中国品牌研究中心与建筑中国新媒体数据研究中心联合发起,凭借自成立20年以来对行业的深刻了解和洞察,见证了中国建筑企业品牌的飞速发展。“202···

北京软件测试培训怎么样啊?靠谱吗?

随着软件测试逐渐变成热门职业,北京越来越多的人想要入行学习,一些问题随着而来:北京的软件测试培训怎么样?靠谱吗?该如何判断呢?今天“好程序员”就来带大家分析一下。首先,北京的软件测试培训机构多如牛毛,这其中有靠谱的,自然也有不靠谱的。那么,···

软件测试培训

  软件测试培训是一门针对软件测试人才培养的技术,培训内容涉及到:软件测试基础、自动化测试、性能测试、安全测试、接口测试、云计算测试等。就业方向:软件开发工程师,软件测试工程师, web前端工程师,移动端开发工程师,软件测试运营等。  在未···

开课啦!工业控制系统网络安全培训招生

一想到你在关注我就忍不住有点紧张培训时间第三期:10月11日-10月16日(11日报到)北京培训内容培训地点在:北京培训对象为:各级各类院校自动化、机电一体化、电气工程、工业机器人、机械工程、车辆工程、电子工程、计算机科学与技术、通信工程等···

看漫画也能学Java?大佬亲自带你进入Java的世界

你还在“Java入门到放弃吗”?看过来看过来,点击​看漫画学JAVA​​《漫画Java》是关东升和赵大羽编著的,一部java入门零基础自学漫画编程,采用漫画加视频讲解的方式,以轻松、愉快、欢乐的学习方式,讲解Java技术知识点,带领小白走进···

互联网走向人工智能时代 北大青鸟培训的"码农"或被淘汰?

未来网北京11月3日电(记者 宋霞霞)“即将到来的互联网大潮,是以大数据和人工智能为标志的,北大青鸟培训的‘码农’很难适应。因为大数据和人工智能对从业人员的知识体系有更高要求,不可能经过几个月培训就能完全胜任。”互联网行业资深从业人员秦帆(···

爆肝Java九大核心专题,666页内容,我收割了5个大厂offer

随着 Java 开发的薪资的越来越高,越来越多人开始学习 Java 。在众多编程语言中,Java学习难度还是偏高的,逻辑性也比较强,但是为什么还有那么多人要学 Java呢 ?今年北京的 Java工程师平均薪资,已经达到 25.3K了,可以说···

基础数据中心架构师雷涛 筑牢大数据“地基”

“基础数据中心架构师,顾名思义,就是数据库及人工智能基础设施的设计者、搭建者,主要服务于互联网后台的大型数据中心建设。”当你接收到精准的短视频推送,当你跟阿尔法狗围棋大战……这一切能实现的背后,都离不开一个词儿:大数据。“数字经济时代,我们···