前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

Java IO

作者头像
翎野君
发布于 2023-05-12 07:50:14
发布于 2023-05-12 07:50:14
32600
代码可运行
举报
文章被收录于专栏:翎野君翎野君
运行总次数:0
代码可运行

IO框架图:

Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以分成四组,分别是:

基于字节操作的 I/O 接口:InputStream 和 OutputStream

基于字符操作的 I/O 接口:Writer 和 Reader

基于磁盘操作的 I/O 接口:File

基于网络操作的 I/O 接口:Socket

前两组主要是根据传输数据的数据格式,后两组主要是根据传输数据的方式,虽然 Socket 类并不在 java.io 包下,但是我仍然把它们划分在一起,因为我个人认为 I/O 的核心问题要么是数据格式影响 I/O 操作,要么是传输方式影响 I/O 操作,也就是将什么样的数据写到什么地方的问题,I/O 只是人与机器或者机器与机器交互的手段,除了在它们能够完成这个交互功能外,我们关注的就是如何提高它的运行效率了,而数据格式和传输方式是影响效率最关键的因素了。我们后面的分析也是基于这两个因素来展开的。

不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所以 I/O 操作的都是字节而不是字符,但是为啥有操作字符的 I/O 接口呢?这是因为我们的程序中通常操作的数据都是以字符形式,为了操作方便当然要提供一个直接写字符的 I/O 接口,如此而已。我们知道字符到字节必须要经过编码转换,而这个编码又非常耗时,而且还会经常出现乱码问题,所以 I/O 的编码问题经常是让人头疼的问题。

1.流的概念

    流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。   一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。   流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。

   实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。 

   形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。

2.流的分类

字节流:一次读入或读出是8位二进制。

字符流:一次读入或读出是16位二进制。

字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

节点流:直接与数据源相连,读入或读出。

直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。

处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。

Jdk提供的流继承了四大类:

InputStream(字节输入流),OutputStream(字节输出流): 主要用来表示 二进制文件(图片、视频、音频、文本文件)

Reader(字符输入流),Writer(字符输出流):表示文本文件(Windows 自带的记事本软件打开能看懂内容的文件)

Java的常用输入、输出流

java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。

  • Java的字节流

InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

  • Java的字符流

Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。 结合开始所说的输入/输出流 ,出现了个一小框架。                      字节流                         字符流 输入流        InputStream               Reader 输出流        OutputStream            Writer

实例1:向文件中写入数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutTest {
    public static void main(String[] args) throws Exception {
        /**
         * 使用字节输入流的步骤
         * 1.打开文件(创建字节输出流对象)
         * 2.写出数据
         * 3.关闭文件(释放资源)
         */
        FileOutputStream fos=new FileOutputStream("src/test.txt", true);
        for(int i=0;i<9;i++){
            fos.write(("this is for test about fileoutstream i= "+i+"\r\n").getBytes());
        }
        fos.close();
    }
}

实例2:从文件中读取数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class FileInptTest {
    public static void main(String[] args) throws Exception {
        /**
         * 使用字节输入流的步骤
         * 1.打开文件(创建字节输入流对象)
         * 2.读取数据
         * 2.1建立一个byte数组
         * 2.2将文件中的内容读取到byte数组中来,然后对其进行处理
         * 3.关闭文件(释放资源)
         */
        FileInputStream fis=new FileInputStream("src/test.txt");
        byte[] b=new byte[1000];
        int len=0;
        while((len=fis.read(b))!=-1){
            System.out.println(new String(b,0,len));
        }
        fis.close();
        
    }
}

实例3:拷贝文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileCopy {
    public static void main(String[] args) throws Exception{
        /**
         * 拷贝:先读在写
         */
        /**
        FileInputStream fis=new FileInputStream("src/test.txt"); 
        byte[] buffer=new byte[10000];
        int length;
        //read方法一次读完但是如果内容字节数大于定义的数组的长度的话就分多次读
        while((length=fis.read(buffer))!=-1){
            System.out.println(length);
            System.out.println("读取成功准备写入新文件。。。");
        }
        //在最后一次循环的时候读完文件后返回的length是-1所以你在取得时候只能按照buffer的长度去取
        for(int i=0;i<length;i++){
            System.out.println(length);
            System.out.println(buffer[i]);
        }
        fis.close();
        FileOutputStream fos=new FileOutputStream("copyfrombu.txt", true);
        fos.write(buffer, 0, buffer.length);
        System.out.println("写入成功");
        fos.close();
        */
        /**
         * 优化
         */
        FileInputStream fis=new FileInputStream("src/bu.txt");
        FileOutputStream fos=new FileOutputStream("bububu.txt",true);
        byte[] buffer=new byte[1000];
        int k;
        while((k=fis.read())!=-1){
            fos.write(k);
        }
        fis.close();
        fos.close();
    }
}

实例4:字节缓冲输入输出流(处理流、过滤流)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class BufferOutPutTest {
    public static void main(String[] args) throws Exception{
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("src/bufferout.txt"));
        for(int i=0;i<5;i++){
            bos.write(("abcd"+i+"\r\n").getBytes());
        }
        bos.close();
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("src/bufferout.txt"));
        byte[] buf=new byte[1000];
        int length=0;
        while((length=bis.read(buf))!=-1){
            System.out.println(new String(buf, 0, length));
        }
        bis.close();
    }
}

实例5:字符串编码问题

解码: 把看不懂的数据解析成 能看懂的数据 例如:字节数组转换成 String 的操作 API: public String(byte[] bytes) 使用平台的默认字符集解码指定的 byte 数组 默认字符集: GBK 编码: 把能看懂的转换成看不懂的 例如:String 转换成字节数组的操作 API: public byte[] getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 默认字符集: GBK public byte[] getBytes(Charset charset)使用给定的 charset 将此 String 编 码到 byte 序列,并将结果存储到新的 byte 数组。 注意:我们这里可能会抛出一个 UnsupportedEncodingException 不支持的编码异常 我们常见的码表:

* Unicode:用两个字节表示一个数据 java中就是使用的Unicode编码 * GB2312:简体中文, 一个数据用两个字节(16位)表示国标码 * GBK编码:在GB2312的基础之上对于中文数据进行了升级 * GB18030:简体中文,是在GBK的基础之上又做了升级 * UTF-8:表示Unicode数据的话需要使用1-6个字节来表示,一般情况1-3个字节即可以表示 * 表示一个汉字用3个字节来表示 * 能用1一个字节表示的数据就用1个字节来表示 * 能用2个字节来表示的数据就用2个字节来表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class StringEncoding {
    public static void main(String[] args) throws Exception {
        /**
         * Unicode:用两个字节表示一个数据 java中就是使用的Unicode编码
         * GB2312:简体中文,    一个数据用两个字节(16位)表示国标码
         * GBK编码:在GB2312的基础之上对于中文数据进行了升级
         * GB18030:简体中文,是在GBK的基础之上又做了升级
         * UTF-8:表示Unicode数据的话需要使用1-6个字节来表示,一般情况1-3个字节即可以表示
         *            表示一个汉字用3个字节来表示
         *            能用1一个字节表示的数据就用1个字节来表示
         *                能用2个字节来表示的数据就用2个字节来表示
         */
        String s="李翎野";
        //将字符串转化为字节数组的形式
        //java中是Unicode编码
        byte[] arr=s.getBytes();
        //转码:转码都是已字节为基础进行转码的而不是字符串
        //Unicode转为GBK
        byte[] gbkarr=s.getBytes("GBK");
        //Unicode转为UTF-8
        byte[] u8arr=s.getBytes("UTF-8");
        /**
         * System.out.println("arr"+arr);
         * 不可以这样打印,这样打出来的是数组的引用,而不是对应的字节码
         */
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(gbkarr));
        System.out.println(Arrays.toString(u8arr));
        
        String s1=new String(arr);
        String s2=new String(gbkarr, "GBK");
        String s3=new String(u8arr,"UTF-8");
        
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        
    }
}

实例6:转换流

问题:为什么需要转换流? 因为,字节流处理汉字 不方便, 所以出现了 转换流。转换流 = 字节流 + 编码表 常见的转换流(API 介绍): OutputStreamWriter: 编码 输出流 InputStreamReader: 解码 输入流

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class FileOutEncoding {
    public static void main(String[] args) throws Exception{
        //字符流
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("src/unicodep.txt"));
        OutputStreamWriter gbk=new OutputStreamWriter(new FileOutputStream("src/gbkp.txt"), "GBK");
        OutputStreamWriter u8=new OutputStreamWriter(new FileOutputStream("src/u8p.txt"), "UTF-8");
        //字符流直接在流里面写汉字就可以了不需要转化为byte
        osw.write("中国");
        gbk.write("中国");
        /**
         * 用文档打开会出现乱码这是因为
         * 当我们向外输出时,用 UTF-8 读进行了编码,而我们的操作系统显示 txt 文档是用 GBK
         * 解码的,由于编码和解码码表不一致,所以就会出现乱码。
         */
        u8.write("中国");
        osw.close();
        gbk.close();
        u8.close();
        
    }
}

实例7:字符缓冲流

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class BufferWriter {
    public static void main(String[] args) throws Exception{
        BufferedWriter bw=new BufferedWriter(new FileWriter("src/gbkp.txt"));
        bw.write("深圳今天下了很多雨");
        bw.close();
        BufferedReader br=new BufferedReader(new FileReader("src/gbkp.txt"));
        int ch=0;
        while((ch=br.read())!=-1){
            System.out.print((char)ch);
        }
        br.close();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.BufferedReader;
import java.io.FileReader;

public class BufferReaderTest {
    public static void main(String[] args) throws Exception{
        BufferedReader br=new BufferedReader(new FileReader("src/gbkp.txt"));
        //直接读字符
        int a=0;
        while((a=br.read())!=-1){
            System.out.println((char)a);
        }
        br.close();
    }
}

实例8:Properties集合

Java中有个比较重要的的类Properties(java.util.Properties),是代表一个持久的一套详细属性,

实现集合与 IO 进行交互 特点: 1: 它是一个 Map 集合, 是 Hashtable 的子类 2: 键和值 都是 String 类型

属性可以被保存到一个流或从流中加载的类。以下是关于属性的要点:

  • 属性列表中每个键及其对应值是一个字符串。
  • 一个属性列表可包含另一个属性列表作为它的“默认”,第二个属性可在列表中搜索,如果没有在原有的属性列表中找到的属性键。
  • 这个类是线程安全的;多个线程可以共享一个Properties对象,而不需要外部同步
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.util.Properties;
import java.util.Set;

public class PropertiesTest {
    public static void main(String[] args) {
        Properties p=new Properties();
        p.setProperty("1", "小花");
        p.setProperty("2", "小明");
        p.setProperty("3", "小王");
        
        Set<String> set=p.stringPropertyNames();
        for(String key:set){
            String va=p.getProperty(key);
            System.out.println(key+" "+va);
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.czbk.no9;

import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;
import java.util.Set;

public class PropertiesFileTest {
    private void storeFile(Properties p) throws Exception{
        p.setProperty("1", "腰疼");
        p.setProperty("2", "脖子疼");
        p.setProperty("3", "眼睛疼");
        p.store(new FileWriter("src/pro.txt"), "This is Test");
    }
    private void loadFile() throws Exception{
        Properties p=new Properties();
        p.load(new FileReader("src/pro.txt"));
        Set<String> ss=p.stringPropertyNames();
        for(String key:ss){
            String va=p.getProperty(key);
            System.out.println(va+key);
        }
    }
    public static void main(String[] args) throws Exception{
        Properties p=new Properties();
        PropertiesFileTest pft=new PropertiesFileTest();
        pft.storeFile(p);
        pft.loadFile();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
那些会阻碍程序员成长的细节[5]
断断续续的写成一个系列,也出乎我的意料,越展开内容越多,有点收不住,Let‘s 继续吧,进入主题。
MavenTalker
2019/07/19
2990
程序员与网站的爱恨情仇
二十一世纪互联网的兴起,网站开发技术蓬勃发展,门槛也随之降低。 程序员在自己电脑上比划着鼠标装了几个软件, 打开IDE, 新建一个页面, 点一下运行按扭,网站跑了起来。 需求来了,程序员用自己顺手的编程语言,一行一行的敲着代码,实现具有各式各样功能的页面, 并把它们相互链接在一起组成一个完整的网站。 程序员在服务器上装了一套和自己工作的电脑上一样的软件 , 把做好的网页文件传到服务器上, 把软件开起来,网站就可以使用了。 做网站真的就这么简单? 程序员有一丝兴奋 ,但更多的是疑惑。 程序员能做出网站来, 并
用户1608022
2018/04/11
7250
那些会阻碍程序员成长的细节[4]
不愿意跟领导走的近。 是不是有这样的体会:凡事有领导在的场合,气氛都比较凝重?整个人都放不开?其实这还是一个雇佣关系在作怪。员工与领导并不是处于一个合作互利互惠状态,也就是《联盟》一书中讲到的合作关系。如果还没看过的话,建议你去买来读一读。跟领导走的近有什么坏处吗?不能偷懒了是真的。在我看来,跟高管成为朋友是对职业生涯有益的事情。可以让领导更深入的了解你,可以站在比自己更高的维度去待人接物,可以接触到很多更高层次的人脉等等等等等,还有很多,待你去发掘。如果有机会,千万不要躲的远远的。
MavenTalker
2019/07/19
2580
那些会阻碍程序员成长的细节[3]
不能主动推动事物前进。 主动做一件事跟被动接受去做事,心情都是不一样的,做事效率更是千差万别。主动的人有更多的成长机会,反之在被动中不断的响应别人的任务,这与处于那个层次高低无关。如果处于高层级却不能主动推进任务前进,相信在这个岗位上也不会呆太久。
MavenTalker
2019/07/19
3430
那些会阻碍程序员成长的细节[6]
威胁性的处理问题。 比较常见的一种就是要挟式加薪,自恃岗位重要或者人员流动太大导致在岗人员变少等等,如果以此种理由去要求加薪有两种后果,一是领导暂时妥协,一旦找到替代者,直接卷铺盖走人,二是领导宁可人手阵痛,也不会助长这种气焰,结局还是卷铺盖走人。
MavenTalker
2019/07/19
3240
那些会阻碍程序员成长的细节[2]
领导安排什么就做什么,做完了就闲着,也不学习新业务新技能。闲下来就刷刷微博朋友圈,看看新闻聊聊天,这是典型的打工者思维,上班工作,某种意义上也是自己创业的过程,在公司的体系下,利用对应的资源来达成自己的目标,本质上与自己出来创业完成某个目标,路径是差不多的。在别人现有的环境里,不能以自己创业心态来待人接物,简单就是一个浪费,这是一个很好锻炼的机会,主动去承担更大的责任,更多的任务。诚然,做的多,出错的概率会更大,但试错的成本很低,成长的机会也更多,没有什么能比成长更好的啦!
MavenTalker
2023/03/07
1880
那些会阻碍程序员成长的细节[2]
他山之石,可以攻玉:从别人的项目中汲取经验
每个人的职业生涯中接触的项目必定是有限,如何更多的去接触项目,来丰富自己的项目经验、技能技巧,从别处学习项目知识几乎是每个软件从业者的必经之路。
MavenTalker
2019/07/19
4630
优秀的程序员应该具备哪些能力?
一般包括4个步骤:第一步,明确和理解问题;第二步,拆分和定位问题;第三步,提出解决方案;第四步总结问题。
杨熹
2019/11/12
1.6K0
年轻一代程序员的机会在哪里?他们的选择是开源
这个世界,归根结底是属于年轻人的。 过去二十年,以程序员为核心的互联网行业,创造了诸多故事,这些故事的结尾通常是阶级跃迁、财务自由或提前退休。但就像每个历经起伏的领域一样,当互联网进入下半场,热潮回归,年轻一代程序员的机会在哪里?他们面临的课题是什么?又在经历着怎样的成长? 带着这些问题,我们采访了两位开源摘星计划的年轻程序员:岳扬、易仁川。与「传统」程序员不同,他们更善于交流、更享受无用、对内卷有着天然的审视,而那些共同的迷茫、焦虑、单纯和无畏,也映照出了每个人曾经的模样。 一 一次意外,诞生了最年轻
腾源会
2022/09/20
4510
年轻一代程序员的机会在哪里?他们的选择是开源
阻碍【程序员职业发展】的 5 个“绊脚石”
许多聪明的软件开发人员在职业生涯初期会尽可能的努力学习、快速成长,然后,在最初几年取得成功之后,步伐往往会逐渐停滞下来。原因是无法一直保持着同预期那样取得持续可观的进步,这会让人失去动力。
掘金安东尼
2022/09/22
2500
阻碍【程序员职业发展】的 5 个“绊脚石”
找到最完美Web开发程序员的5个技巧
找到最完美Web开发程序员的5个技巧 如果你想要找个自由开发人员协作开发项目,那么问题来了,该如何找到一个完美的开发人员呢?这是一个艰巨的任务。之所以用艰巨这个形容词,其实一点也不夸张,哪怕你有着再丰
用户1289394
2018/02/27
5700
找到最完美Web开发程序员的5个技巧
没上过大学的程序员怎么赶上那些正牌大学毕业的程序员呢?
计科专业在嵌入式领域做了十几年,前前后后经历了四家公司,面试过的程序员不下百十个,还真有没上大学的程序员而且干的还不错的,但数量比例毕竟还属于少数,程序员目前在国内大约500万+,绝对的数量已经非常巨大了,而且绝大部分是本科以上学历,没有上过大学的程序员,是有的真正的数量还是比价稀缺。曾经在第二家公司工作的时候,遇见过一个高中毕业的程序员,水平还非常高,属于天生就做程序员的料,在公司呆了一年多,之后被猎头挖到了百度公司,算起来已经有5个年头了,现在还一直在。
程序员互动联盟
2019/05/08
9750
没上过大学的程序员怎么赶上那些正牌大学毕业的程序员呢?
从刷厕所到大牛程序员,他的抗争改变了生活
2005年,乔布斯在斯坦福大学毕业演讲中说过,他最喜欢的一句话叫做“Stay hungry, Stay foolish”,希望自己永远保持这个饥渴又好奇的状态。
养码场
2018/08/13
4010
那些阻碍程序员成长的小细节,看看你有吗?
拿到开发任务后,直接上手写代码。 缺少必要的沟通与设计,返工的机率极大。前后端数据的交互格式,功能潜在的关联点不清晰,接口调用方功能是否完备,存储结构的设计,复杂业务的流程设计等等,都需要事先沟通确定好,再动手写代码才能游刃有余,不然会走一步卡一步,进展缓慢,甚至倒退。
MavenTalker
2020/05/18
6460
那些阻碍程序员成长的小细节,看看你有吗?
提高你的被动收入
工作前几年,相信不少程序员朋友都会沉浸在提升自我技能,获取更大职业进步的目标中,这样想这样做都没有错,但不应该忽略了职业之外的成长,这两种成长都是需要的,不可偏失一个。
MavenTalker
2019/07/19
9010
成长的模式:如何从毕业生到技术专家?
过去的一个月里,在帮助其他部门进行毕业生培训。从名称上说是培训,但是实际上则是训战结合。不想一下子给太多,这篇文章会给的建议是: 寻找持续成长的动机 塑造整洁的编码习惯 建立定位问题的方式 学习既有的模式 频繁性自我总结 只凭这五点来说,与《福格行为模型》所定义的三要素也是颇为相似的: 要素1 动机(Motivation):找到实现愿望的黄金行为 要素2 能力:让行为简单到随时顺便都能做 要素3 提示:善用锚点时刻让行为立刻发生 如果再简化来说,也可以采用和我一样的模式,通过基本简单的行为:每天写代码,每周
Phodal
2022/08/25
1.1K0
前端与后端的抉择:一位国外程序员的职业故事
大家好,今天我要分享的是一位国外程序员的真实经历,他在前端和后端之间的抉择,不仅仅是技术的选择,更是一段关于热情、挑战和成长的旅程。
前端达人
2024/01/03
2140
前端与后端的抉择:一位国外程序员的职业故事
漂洋过海去学习,一文读懂程序员如何从初级升级到高级
还记得前几天跃哥的这篇推文吗?《知道吗,你和高级工程师差距巨大》这篇和大家简单的聊了聊程序员和高级程序员的差距,目的就是为了让大家有一个深刻的认知,然后朝着这个目标去奋斗。
程序员小跃
2020/05/11
4630
出现这十种症状,说明你不适合干程序员这个行当
评论按,学习是一件艰苦的事情。很多人想要成为程序员,在学习编程的过程中,面对各种 bug 和源源不断的问题,有时会对自己是否适合编程这一问题产生困扰。
Java帮帮
2019/07/07
7010
请不要说自己是Java程序员
英文的玩笑,用中文看有点不太容易懂。它的意思就是一个关于 Python(蟒蛇)经验只有三周前去过一次动物园的程序员,只要他足够的好,他也可以用一周的时间,基于 Python/Django 完成一个在线论坛。
Java团长
2018/07/23
3460
推荐阅读
相关推荐
那些会阻碍程序员成长的细节[5]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档