精华内容
下载资源
问答
  • 和文件关系输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件各种输入输出操 作,他们分别是ifstream、ofstream、fstream,其中fstream...

    文件流类和文件流对象

    输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。

    和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操 作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示。

    8b020c2fecc0330fe61610c3005f934e.png

    由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在fstream.h头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个该类的对象。

    ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。

    ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。

    fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

    打开文件

    所谓打开(open)文件是一种形象的说法,如同打开房门就可以进入房间活动一样。 打开文件是指在文件读写之前做必要的准备工作,包括:

    1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。

    2)指定文件的工作方式,如,该文件是作为输入文件还是输出文件,是ASCII文件还是二进制文件等。

    以上工作可以通过两种不同的方法实现。

    1) 调用文件流的成员函数open。如

    ofstream outfile; //定义ofstream类(输出文件流类)对象outfile

    outfile.open("f1.dat",ios::out); //使文件流与f1.dat文件建立关联

    第2行是调用输出文件流的成员函数open打开磁盘文件f1.dat,并指定它为输出文件, 文件流对象outfile将向磁盘文件f1.dat输出数据。ios::out是I/O模式的一种,表示以输出方式打开一个文件。或者简单地说,此时f1.dat是一个输出文件,接收从内存输出的数据。

    调用成员函数open的一般形式为:

    文件流对象.open(磁盘文件名, 输入输出方式);

    磁盘文件名可以包括路径,如"c:newf1.dat",如缺省路径,则默认为当前目录下的文件。

    2) 在定义文件流对象时指定参数

    在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如

    ostream outfile("f1.dat",ios::out); 一般多用此形式,比较方便。作用与open函数相同。

    输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,见表13.6。

    18c2f630b8f194b34d64429d409433d3.png

    几点说明:

    1) 新版本的I/O类库中不提供ios::nocreate和ios::noreplace。

    2) 每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文 件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1),表示文件结束 了。

    3) 可以用“位或”运算符“|”对输入输出方式进行组合,如表13.6中最后3行所示那样。还可以举出下面一些例子:

    ios::in | ios:: noreplace //打开一个输入文件,若文件不存在则返回打开失败的信息

    ios::app | ios::nocreate //打开一个输出文件,在文件尾接着写数据,若文件不存在,则返回打开失败的信息

    ios::out l ios::noreplace //打开一个新文件作为输出文件,如果文件已存在则返回打开失败的信息

    ios::in l ios::out I ios::binary //打开一个二进制文件,可读可写

    但不能组合互相排斥的方式,如 ios::nocreate l ios::noreplace。

    4) 如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。可以据此测试打开是否成功。

    如 if(outfile.open("f1.bat", ios::app) ==0)

    cout <<"open error";

    或 if( !outfile.open("f1.bat", ios::app) )

    cout <<"open error";

    关闭文件

    在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。

    如 outfile.close( ); //将输出文件流所关联的磁盘文件关闭

    所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样就不能再通过文件流对该文件进行输入或输出。此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出。如

    outfile.open("f2.dat",ios::app|ios::nocreate);

    此时文件流outfile与f2.dat建立关联,并指定了f2.dat的工作方式。

     #include<fstream>  //文件读写
                     //文本文件读写(即ascII文件)
     void test01() {
     
         const char* fileName = "D:桌面source.txt";
         const char* TagetName = "D:桌面target.txt";
         ifstream ism(fileName, ios::in); //只读方式打开文件
         ofstream osm(TagetName, ios::out | ios::app);
         //ifstream ism;
         //ism.open(fileName,ios::in);
     
         if (!ism) {
             cout << "打开文件失败!" << endl;
             return;
         }
     
         //读文件
         char ch;
         while (ism.get(ch)) {
             cout << ch;
             osm.put(ch);
         }
     
         //关闭文件
         ism.close();
         osm.close();
     }
    

    C++对二进制文件的读写操作

    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。

    对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。

    用成员函数read和write读写二进制文件

    对二进制文件的读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为

        istream& read(char *buffer,int len);
        ostream& write(const char * buffer,int len);

    字符指针buffer指向内存中一段存储空间。len是读写的字节数。调用的方式为:

     a.write(p1,50);
     b.read(p2,30);

    上面第一行中的a是输出文件流对象,write函数将字符指针p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。在第二行中,b是输入文件流对象,read 函数从b所关联的磁盘文件中,读入30个字节(或遇EOF结束),存放在字符指针p2所指的一段空间内。

     //二进制文件操作  对象序列化
     class Person{
     public:
         Person(){}
         Person(int age,int id):age(age),id(id){}
         void Show(){
             cout << "Age:" << age << " Id:" << id << endl;
         }
     public:
         int age;
         int id;
     };
     
     void test02(){
         Person p1(10, 20), p2(30, 40); //二进制
         const char* TagetName = "D:桌面target.txt";
         //把p1 p2写进文件里   
         ofstream osm(TagetName, ios::out | ios::binary);
         osm.write((char*)&p1, sizeof(Person)); //二进制方式写文件
         osm.write((char*)&p2, sizeof(Person));
         osm.close();
     
         ifstream ism(TagetName,ios::in | ios::binary);
         ism.read((char*)&p1, sizeof(Person)); //从文件读取数据
         ism.read((char*)&p2, sizeof(Person)); //从文件读取数据
     
         p1.Show();
         p2.Show();
     }
    
    展开全文
  • 浅析B/S架构数据库连接方式

    千次阅读 2016-07-27 20:03:21
    在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么? 目录 1.普通连接方式 2.单例模式 3.连接池 分析 普通连接: 下面是我们一般使用的普通连接...
    前言
    在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?

    目录
    1.普通连接方式
    2.单例模式
    3.连接池

    分析
    普通连接:
    下面是我们一般使用的普通连接方式的代码(jsp)
    [Java] 纯文本查看 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    packagecom.jdbc.dao;
    importjava.sql.*;
     
    publicclass BaseDAO {
            //打开数据库链接
            publicConnection getConn()
            {
                    Connection conn = null;
                    try{
                            //加载驱动
                            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                            //打开链接
                            conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName = epetDB","sa","sa");
                    }catch(ClassNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                    }catch(SQLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                    }
                    returnconn;
            }
            //(重写)关闭链接
            publicvoid Close(Connection conn,PreparedStatement pstmt,ResultSet rs)
            {
                    try{
                            //关闭结果集
                            if(rs != null) {
                                    rs.close();
                            }
                            //关闭PerparedStatement对象
                            if(pstmt != null) {
                                    pstmt.close();
                            }
                            //关闭链接
                            if(conn != null) {
                                    conn.close();
                            }
                    }catch(Exception e) {
                            // TODO: handle exception
                    }
            }
            //(重写)关闭链接
            publicvoid Close(Connection conn,PreparedStatement pstmt)
            {
                    try{
                            //关闭PerparedStatement对象
                            if(pstmt != null) {
                                    pstmt.close();
                            }
                            //关闭链接
                            if(conn != null) {
                                    conn.close();
                            }
                    }catch(Exception e) {
                            // TODO: handle exception
                    }
            }
            //增删改操作
            publicint Update(String sql,Object[] parm)
            {
                    intiRet = 0;
                    Connection conn = null;
                    PreparedStatement pstmt = null;
                    try{
                            conn = getConn();
                            pstmt = conn.prepareStatement(sql);
                            //循环赋值参数
                            for(inti = 0; i < parm.length; i++) {
                                    //为预编译sql设置参数
                                    pstmt.setObject(i+1, parm);
                            }
                            //执行SQL语句
                            iRet = pstmt.executeUpdate();
                    }catch(Exception e) {
                            e.printStackTrace();
                    }
                    finally
                    {
                            Close(conn,pstmt);
                    }
                    returniRet;
            }
    }

    普及:
    [Java] 纯文本查看 复制代码
    ?
    1
    2
    3
    4
    5
    6
    7
    try{
    //可能出现异常的代码
    }catch(Execption e){
    //如果发生异常处理的代码
    }finally{
    //无论是否异常都会执行的代码
    trycatch finally java中异常处理机制

    我们来分析一下写一段代码,其中Update方法是用来更新数据的,其中我们可以看到try中包含了getConn()方法用来获取Connection连接对象,到最后我们可以在finally代码块中看到Close()方法用来关闭创建的Connection对象以及PreparedStatement对象,这么消耗我们很大的内存空间。
    如果用户同时点注册按钮那么服务器首先执行打开数据库连接Connection多个用户注册就会打开多个Connection那么并且同时添加到数据库,服务器就会在执行添加的时候就会发生异常。分不清楚用户注册的信息。举个例子:
    左边的三个人同时对另一人喊不同的一个字,右边的一个人就会分不清,左边三个人喊了什么?(可以做真人实例)

    总结:
    从分析中,我们看到普通的连接方式中无法处理并发问题!如果你想知道解决方法那么请继续看下去。

    单例连接:
    下面一段单利模式中的数据库连接代码
    [Java] 纯文本查看 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    packagedao;
     
    importjava.sql.Connection;
    importjava.sql.DriverManager;
    importjava.sql.SQLException;
     
    publicclass BaseDao {
            privateString className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            privateString url = "jdbc:sqlserver://localhost:1433;databasename=SQLTMP";
            privateString user = "sa";
            privateString pwd = "sa";
            privatestatic Connection conn = null;
             
            privateBaseDao(){
                    try{
                            Class.forName(className);
                            conn = DriverManager.getConnection(url,user,pwd);
                    }catch(ClassNotFoundException e) {
                            e.printStackTrace();
                    }catch(SQLException e) {
                            e.printStackTrace();
                    }
                     
            }
             
            publicstatic Connection getConn(){
                    if(conn != null){
                            returnconn;
                    }else{
                            newBaseDao();
                            returnconn;
                    }
            }
    }

    普及:
    构造方法:访问修饰符(public|private) 类名
    构造方法在实例化的时候就会调用

    我们分析一下这一段代码中Connection在构造方法中创建用过getConn方法获取连接。

    我们从图片中和代码中可以看到全程中只有一个Connection连接,那么这样就可以降低服务器的压力,解决并发问题
    总结:
    从分析中,我们看到单例模式,可以减轻服务器的压力,解决并发问题,如果够仔细的话大家会发现getConn方法是一个静态方法,而且其他属性和方法都是private从而大大提高了安全性。这种连接方式适合:个人开发和国家单位开发(安全性高)

    连接池:
    下面一段连接池数据库连接代码
    [Java] 纯文本查看 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    context.xml
            <Resource 
                    name="news"
                    auth="Container"
                    type="javax.sql.DataSource"
                    maxActive="100"
                    maxIdle="30"
                    maxWait="1000"
                    username="sa"
                    password="sa"
                    driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                    url="jdbc:sqlserver://localhost:1433;DatabaseName=NewsManagerSystem"
                    />
    Web.xml
    <resource-ref>
        <description>news DataSource</description>
        <res-ref-name>news</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>  
     
    packagecom.news.dao;
    importjava.sql.*;
     
    importjavax.naming.*;
    importjavax.sql.DataSource;
     
    publicclass BaseDao {
            /**
             * 创建连接池
             * */
            publicConnection getConn(){
                    Connection conn = null;
                    try{
                            Context ctx = newInitialContext();
                            DataSource ds = (DataSource)ctx.lookup("java:comp/env/news");
                            conn = ds.getConnection();
                    }catch(NamingException e) {
                            e.printStackTrace();
                    }catch(SQLException e) {
                            e.printStackTrace();
                    }
                    returnconn;
            }
    }

    普及:

    连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要他们的线程使用。

    我们可以直接使用getConn方法获得Connection并且执行数据操作,执行完成之后连接池会回收Connection这样就解决了普通模式中的并发问题.

    总结:
    从分析中,我们看到Connection不需要创建,这样就简化编程模式,这样减少了连接的创建时间,连接池能够使性能最大化,同事还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

    原文链接:http://bbs.ichunqiu.com/thread-8784-1-1.html?from=jiuge
    展开全文
  • 4、编程用JAVA解析XML的方式. 115 5、XML文档定义几种形式?它们之间何本质区别?解析XML文档哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 ...
  • 这个程序里我们实现了两类窗口打开的方式,一个是自身消失而 后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的 方法是不同的。 三、Qt Creator 登录对话框(原创) 实现功能: 在弹出对话框...
  • seq2seq模型可用于文本摘要(并非简单地选择、重排原始文本的段落),然后这些模型两个缺点:不易关注真实细节,以及倾向于生成重复文本。 本文提出一种新颖的架构:使用两种方式增强标准的seq2seq注意力模型。第...

    Reference
    1. Get To The Point: Summarization with Pointer-Generator Networks


    seq2seq模型可用于文本摘要(并非简单地选择、重排原始文本的段落),然后这些模型有两个缺点:不易关注真实细节,以及倾向于生成重复文本

    本文提出一种新颖的架构:使用两种方式增强标准的seq2seq注意力模型。第一,使用混合指针生成网络,利用指针从原文精确地复制单词,同时保留生成器产生新单词的能力。第二,使用覆盖机制跟踪哪些单词已经被摘取,避免生成重复文本。

    1 引言

    文本摘要任务旨在输出仅包含原文主要信息的压缩文本,大致具有两种方法:抽取式摘要式。抽取式方法直接抽取段落原文,而摘要式方法可能生成一些原文中并非出现的单词或短语,类似于人类写的摘要。

    抽取式方法相对容易,因为直接抽取原文大段文本,可保证语法和准确性。从另一个角度来说,模型的经验能力对于生成高质量摘要至关重要,如改写、总结,以及结合现实世界知识,仅摘要式框架具备这种可能性。

    摘要式总结较为困难,先前模型大多采用抽取式,最近提出的seq2seq模型使得摘要式总结成为可能。尽管seq2seq模型具备很大潜力,但它们也暴露了一些不良行为,如无法准确复制真实细节无法处理OOV问题,以及倾向于自我重复
    在这里插入图片描述

    本文提出一种网络结构,在多句上下文总结中解决以上三个问题。最近的摘要式模型主要关注与标题生成(将一两句话缩减至单一标题),我们相信长文本摘要挑战与实用性并存,本文使用CNN/Daily Mail数据集,其包含新闻文章(平均39句)和多句摘要,结果显示,本文提出的模型高于SOTA模型2个ROUGE点。

    本文的混合指针生成模型通过指针从原文中复制单词,文本生成准确性提高,并解决了OOV问题,同时保留生成原文中未出现的新单词的能力,该网络可视为摘要方法和抽取方法之间的平衡,类似于应用于短文本摘要的 CopyNetForced-Attention Sentence Compression 模型。我们提出一种新型的覆盖向量(源于NMT,可用于跟踪和控制原文的覆盖率),结果表明,覆盖机制对于消除重复性非常有效。

    2 本文模型

    2.1 Seq2Seq 注意力模型

    本文基线模型类似于图2中的模型:
    在这里插入图片描述
    文中各token依次输入至单层BiLSTM,网络输出编码器隐状态序列hih_i,在时间步tt,解码器(单层单向LSTM)接收到先前单词的词向量(训练阶段为参考摘要的前一个单词,测试阶段为解码器上一时刻输出的单词),输出隐状态sts_t

    基于Bahdanau et al.(2015)注意力机制,计算注意力分布:
    在这里插入图片描述
    式中,v,Wh,Ws,battnv, W_h, W_s, b_\text{attn}为可学习的参数。注意力分布可看作为源单词的概率分布,告诉解码器应关注哪些单词生成下一个单词。接着,使用注意力机制加权编码器隐状态,输出上下文向量hth_t^*:
    在这里插入图片描述
    上下文向量可看作为固定维度的、当前时间步从源中读取的内容,将其与解码器隐状态sts_t拼接,输入至两层线性网络,产生词典概率分布PvocabP_\text{vocab}
    在这里插入图片描述

    式中,V,V,b,bV, V', b, b'为可学习参数。PvocabP_\text{vocab}为词典中所有单词的概率分布,告知我们预测单词ww的最终概率分布:
    在这里插入图片描述

    训练阶段,时间步tt的损失为目标单词wtw_t^*的负对数似然:
    在这里插入图片描述
    整个序列的全部损失为
    在这里插入图片描述

    2.2 指针生成网络

    本文模型为基线模型seq2seq和指针网络的混合,其允许通过指针复制单词,以及从固定大小的词典中生成单词。在图三所示的指针生成网络中,注意力分布ata^t和上下文向量hth_t^*可以利用2.1章节所述公式计算。

    此外,时间步利用上下文向量hth_t^*,解码器隐状态sts_t,解码器输入xtx_t计算生成概率分布:
    在这里插入图片描述
    式中,向量wh,ws,wxw_{h^*},w_s,w_x和变量bptrb_\text{ptr}为可学习参数,σ\sigma为sigmoid函数。pgenp_\text{gen}可看作为软开关,用于选择是利用PvocabP_\text{vocab}从词表中抽取单词,还是利用注意力分布ata_t从输入句抽取单词。

    对于每一篇文档,将原文中所有出现的单词和词典结合为扩充词典,获得在扩展词典上的概率分布:
    在这里插入图片描述
    注意到,如果ww不存在与词典中,则Pvocab(w)=0P_\text{vocab}(w)=0;类似地,如果ww不存在于原文中,则i:wi=wait=0\sum_{i:w_i=w}a_i^t=0。产生OOV单词的能力是指针网络的主要优势之一,而我们的基线模型产生单词的数量局限于预设置的词典。损失函数如公式(6)和(7)所示,但我们修改为公式(9)所示的概率分布P(w)P(w)

    2.3 覆盖机制(Coverage mechanism)

    重复是seq2seq模型的常见问题,在生成多句时尤其明显(如图1所示),我们采用覆盖机制解决这个问题。覆盖机制模型中,我们维持之前所有解码步的注意力分布之和作为覆盖向量ct\bm{c_t}
    在这里插入图片描述
    直观上,ct\bm{c_t}为原文单词上的分布(未归一化),表示这些单词到目前为止从注意力机制中所获得的覆盖度。注意到,c0\bm{c^0}为零向量,因为初始时刻源文中没有任何单词被覆盖。

    覆盖向量作为注意力机制的额外输入,将公式(1)改为
    在这里插入图片描述
    式中,wcw_c是与vv具有相同长度的可学习向量。覆盖机制使得注意力机制的当前决策受其先前决策(ctc_t之和)影响,因此应该更易避免注意力机制关注相同位置,从而避免生成重复文本。

    我们发现,额外定义覆盖损失惩罚重复关注相同位置是必要的,覆盖损失
    在这里插入图片描述
    覆盖损失有界:covlosstiait=1\text{covloss}_t\leq\sum_ia_i^t=1,公式(12)中的覆盖损失有别于机器翻译中的覆盖损失。MT中,假定翻译率大致为1:1,如果覆盖向量大于或小于1,其将作为惩罚向量。本文损失函数比较灵活,因为摘要不需要一致覆盖率,本文仅惩罚注意力机制与到目前为止的覆盖向量之间的重叠部分,防止重复关注。

    最终,使用超参数λ\lambda加权覆盖损失至先前损失,产生新的合成损失:
    在这里插入图片描述

    展开全文
  • 还将使用引用变量,它们提供了另一种将信息传递给函数的方式。默认参数使函数能够自动为函数调 用中省略的函数参数提供值。函数重载使程序员能够创建多个参数列表不同的同名函数。类设计中经常使 用这些特性。另外...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    不同编译器给出不同i值,有的为3,有的为4,哪个是正确? 34  *3.4 这样一个巧妙表达式:a^= b^= a^= b; 它不需要临时变量就可以交换a和b值。 34 3.5 可否用显式括号来强制执行我所需要计算顺序并...
  • 还将使用引用变量,它们提供了另一种将信息传递给函数的方式。默认参数使函数能够自动为函数调 用中省略的函数参数提供值。函数重载使程序员能够创建多个参数列表不同的同名函数。类设计中经常使 用这些特性。另外...
  • 还将使用引用变量,它们提供了另一种将信息传递给函数的方式。默认参数使函数能够自动为函数调 用中省略的函数参数提供值。函数重载使程序员能够创建多个参数列表不同的同名函数。类设计中经常使 用这些特性。另外...
  • java笔记——IO流练习1

    2018-09-16 16:14:55
    重点说明:想要使用一个类方法,必须了解它方法有哪些,分别如何使用,有什么用途。因此必须学会查看Java API,这就相当于学汉字是需要查阅字典,如果单纯敲代码,而不知其义,就无法理解为何使用该方法。 ...

    重点说明:想要使用一个类的方法,必须了解它的方法有哪些,分别如何使用,有什么用途。因此必须学会查看Java API,这就相当于学汉字是需要查阅字典,如果单纯的敲代码,而不知其义,就无法理解为何使用该方法。

    https://www.lanzous.com/i1vykcd(jdk1.8 API)

     

    目录

    IO练习1:

    1.复制文本文件

              1)字节流的四种方式

               2)字符流的5种方式

    2.复制图片

    3.把ArrayList集合中的字符串数据存储到文本文件

    4.从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合

    5.复制单极文件夹

    6.复制单极文件夹中指定文件并修改文件名称

    7复制多极文件夹

     

     


    IO练习1:


    1.复制文本文件

              1)字节流的四种方式

    /*字节流复制文本文件一共4种方式*/
    //方式一
    	/**基本字节流一次读写一个字节:
    	 * @throws IOException */
    	private static void method1() throws IOException {
    		//1.创建基本字节输入流对象
    		FileInputStream fis=new FileInputStream("a.txt");
    		//2.创建基本字节输出流对象
    		FileOutputStream fos=new FileOutputStream("b.txt");
    		//3.开始复制
    		int by=0;
    		while((by=fis.read())!=-1){
    			fos.write(by);
    		}
    		//4.释放资源
    		fos.close();
    		fis.close();
    	}
    
    //方式二
    /**基本字节流一次读写一个字节数组
    	 * @throws IOException */
    	private static void method2() throws IOException {
    		//1.创建基本字节输入流对象
    				FileInputStream fis=new FileInputStream("a.txt");
    				//2.创建基本字节输出流对象
    				FileOutputStream fos=new FileOutputStream("b.txt");
    				//3.开始复制
    				byte[] bys=new byte[1024];
    				int len=0;
    				while((len=fis.read(bys))!=-1){
    					fos.write(bys);
    				}
    				//4.释放资源
    				fos.close();
    				fis.close();
    	}
    
    //方式三
    /**高效字节流一次读写一个字节
    	 * @throws IOException */
    	private static void method3() throws IOException {
    		//1.创建基本字节输入流对象
    				BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
    				//2.创建基本字节输出流对象
    				BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("Cb.txt"));
    				//3.开始复制
    				int by=0;
    				while((by=bis.read())!=-1){
    					bos.write(by);
    				}
    				//4.释放资源
    				bos.close();
    				bis.close();
    	}
    
    //方式四
    /**高效字节流一次读写一个字节数组
    	 * @throws IOException */
    	private static void method4() throws IOException {
    		//1.创建基本字节输入流对象
    		BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
    		//2.创建基本字节输出流对象
    		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("b.txt"));
    		//3.开始复制
    		byte[] bys=new byte[1024];
    		int len=0;
    		while((len=bis.read(bys))!=-1){
    			bos.write(bys);
    		}
    		//4.释放资源
    		bos.close();
    		bis.close();
    	}

            2)字符流的5种方式

    // 基本字符流,一次读取一个字符
    	private static void method1(String srcPath, String desPath)
    			throws IOException {
    		FileReader fr = new FileReader(srcPath);
    		FileWriter fw = new FileWriter(desPath);
    
    		int ch = 0;
    		while ((ch = fr.read()) != -1) {
    			fw.write(ch);
    		}
    
    		fr.close();
    		fw.close();
    	}
    
    	// 基本字符流,一次读取一个字符数组
    	private static void method2(String srcPath, String desPath)
    			throws IOException {
    		FileReader fr = new FileReader(srcPath);
    		FileWriter fw = new FileWriter(desPath);
    
    		char[] chs = new char[1024];
    		int len = 0;
    		while ((len = fr.read(chs)) != -1) {
    			fw.write(chs, 0, len);
    		}
    
    		fr.close();
    		fw.close();
    	}
    
    	// 高效流,一次读取一个字符
    	private static void method3(String srcPath, String desPath)
    			throws IOException {
    		BufferedReader br = new BufferedReader(new FileReader(srcPath));
    		BufferedWriter bw = new BufferedWriter(new FileWriter(desPath));
    
    		int ch = 0;
    		while ((ch = br.read()) != -1) {
    			bw.write(ch);
    			bw.flush();
    		}
    
    		br.close();
    		bw.close();
    	}
    
    	// 高效流,一次读取一个字符数组
    	private static void method4(String srcPath, String desPath)
    			throws IOException {
    		BufferedReader br = new BufferedReader(new FileReader(srcPath));
    		BufferedWriter bw = new BufferedWriter(new FileWriter(desPath));
    
    		char[] chs = new char[1024];
    		int len = 0;
    		while ((len = br.read(chs)) != -1) {
    			bw.write(chs, 0, len);
    			bw.flush();
    		}
    
    		br.close();
    		bw.close();
    	}
    
    	// 高效流,一次读取一行
    	private static void method5(String srcPath, String desPath) throws IOException {
    		BufferedReader br = new BufferedReader(new FileReader(srcPath));
    		BufferedWriter bw = new BufferedWriter(new FileWriter(desPath));
    
    		String line=null;
    		while ((line = br.readLine()) != null) {
    			bw.write(line);
    			bw.newLine();
    			bw.flush();
    		}
    
    		br.close();
    		bw.close();
    	}
    
    }


    2.复制图片

    /*类似于文本复制,使用字节流*/


    3.把ArrayList集合中的字符串数据存储到文本文件

    public class ArrayListToFileDemo {
    	public static void main(String[] args) throws IOException {
    		// 创建ArrayList结合对象
    		ArrayList<String> array = new ArrayList<String>();
    		// 添加集合元素
    		array.add("hello");
    		array.add("world");
    		array.add("java");
    		// 封装目的地
    		BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
    		// 遍历集合,并把每一个元素写入文本文件
    		for (String s : array) {
    			// 写数据
    			bw.write(s);
    			// newLine() 写一行行分隔符。
    			bw.newLine();
    			// flush() 刷新流。
    			bw.flush();
    		}
    		//释放资源
    		bw.close();
    	}
    }


    4.从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合

    public class FileToArrayListDemo {
    	public static void main(String[] args) throws IOException {
    		//封装数据源
    		BufferedReader br=new BufferedReader(new FileReader("a.txt"));
    		//创建集合对象
    		ArrayList<String> array = new ArrayList<String>();
    		//读取文本文件,每读取一行(每一行就是一个字符串数据),就添加到集合中
    		String line=null;
    		//readLine(),读取一行,如果已达到流的末尾,则为null 
    		while((line=br.readLine())!=null){
    			array.add(line);
    		}
    		//释放资源
    		br.close();
    		/*//可以遍历集合,查看是否成功
    		for(String s:array){
    			System.out.println(s);
    		}*/
    	}
    }


    5.复制单极文件夹

    /*
     * 需求:复制单级文件夹:
     * 数据源:e:\\demo
     * 目的地:e:\\test
     * 
     * 分析:
     * 		A:封装目录
     * 		B:获取该目录下所有文本的File数组
     * 		C:遍历该File数组,得到每一个File对象
     * 		D:把该File进行复制
     * */
    public class CopyFolderDemo {
    	public static void main(String[] args) throws IOException {
    		//封装目录
    		File srcFolder=new File("e:\\demo");
    		File destFolder=new File("e:\\test");
    		//如果目的文件夹不存在就创建
    		if(!destFolder.exists()){
    			destFolder.mkdir();
    		}
    		//获取该目录下所有文本的File数组
    		File[] fileArray = srcFolder.listFiles();
    		//遍历该File数组,得到每一个File对象
    		for(File file:fileArray){
    			String name = file.getName();
    			File newFile = new File(destFolder,name);
    			copyFile(file,newFile);
    		}
    	}
    
    	private static void copyFile(File file, File newFile) throws IOException {
    		BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
    		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(newFile));
    		
    		byte[] bys=new byte[1024];
    		int len=0;
    		while((len=bis.read(bys))!=-1){
    			bos.write(bys, 0, len);
    		}
    		
    		bis.close();
    		bos.close();
    	}
    }


    6.复制单极文件夹中指定文件并修改文件名称

    public class CopyFolderDemo {
    	public static void main(String[] args) throws IOException {
    		// 封装数据源
    		File srcFolder = new File("e:\\java");
    		// 封装目的地
    		File destFolder = new File("e:\\jad");
    		// 获取该目录下java文件的File数组
    		File[] fileArray = srcFolder.listFiles(new FilenameFilter() {
    			@Override
    			public boolean accept(File dir, String name) {
    				return new File(dir, name).isFile() && name.endsWith(".java");
    			}
    		});
    		// 遍历该File数组,获取每一个File对象
    		for (File file : fileArray) {
    			// 数据源:e:\java\DataTypeDemo.java
    			// 目的地:e:\\jad\DataTypeDemo.java
    			String name = file.getName();
    			File newFile=new File(destFolder,name);
    			copyFile(file, newFile);//这一步主要是把内容复制过来
    		}
    		//在目的地目录下改名
    		File[] destFileArray = destFolder.listFiles();
    		for(File destFile:destFileArray){
    			String name = destFile.getName();
    			String newName = name.replace(".java", ".jad");
    			File newFile=new File(destFolder,newName);
    			destFile.renameTo(newFile);
    		}
    
    	}
    	private static void copyFile(File file, File newFile) throws IOException {
    		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    				file));
    		BufferedOutputStream bos = new BufferedOutputStream(
    				new FileOutputStream(newFile));
    
    		byte[] bys = new byte[1024];
    		int len = 0;
    		while ((len = bis.read(bys)) != -1) {
    			bos.write(bys, 0, len);
    		}
    
    		bos.close();
    		bis.close();
    	}
    }


    7复制多极文件夹

    /*
     * 需求:复制多级文件夹
     * 数据源:E:\JavaSE\day21\code\demos
     * 目的地:E:\\
     * 
     * 分析:
     * 		1.封装数据源File
     * 		2.封装目的地File
     * 		3.判断该文件夹是文件还是文件夹
     * 				a:是文件夹
     * 					就在目的地目录下创建该文件夹
     * 					获取该File对象下所有文件或文件夹File对象
     * 					遍历得到每一个File对象
     * 					回到3
     * 				b:是文件
     * 					就复制(字节流)
     * */
    public class CopyFoldersDemo {
    	public static void main(String[] args) throws IOException {
    		// 封装数据源File
    		File srcFile = new File("E:\\JavaSE\\day21\\code\\demos");
    		// 封装目的地File
    		File destFile = new File("E:\\");
    
    		// 复制文件夹的功能
    		copyFolder(srcFile, destFile);
    	}
    
    	private static void copyFolder(File srcFile, File destFile) throws IOException {
    		// 判断该File是文件还是文件夹
    		if (srcFile.isDirectory()) {
    			// 如果是文件夹,就在目的地目录下创建该文件夹
    			File newFolder = new File(destFile, srcFile.getName());
    			newFolder.mkdir();
    			// 然后获取该文件夹下的所有文件或文件夹File对象
    			File[] fileArray = srcFile.listFiles();
    			for (File file : fileArray) {
    				// 递归判断
    				copyFolder(file, newFolder);
    			}
    		} else {
    			// 如果是文件,就直接复制到该目录下
    			File newFile = new File(destFile, srcFile.getName());
    			copyFile(srcFile, newFile);
    		}
    	}
    
    	private static void copyFile(File srcFile, File newFile) throws IOException {
    		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    				srcFile));
    		BufferedOutputStream bos = new BufferedOutputStream(
    				new FileOutputStream(newFile));
    
    		byte[] bys = new byte[1024];
    		int len = 0;
    		while ((len = bis.read(bys)) != -1) {
    			bos.write(bys, 0, len);
    		}
    
    		bos.close();
    		bis.close();
    	}
    }

     

     

    展开全文
  • 不同编译器给出不同i值,有的为3,有的为4,哪个是正确? *3.4 这样一个巧妙表达式:a^=b^=a^=b;它不需要临时变量就可以交换a和b值。 3.5 可否用显式括号来强制执行我所需要计算顺序并控制相关副...
  • 不同编译器给出不同i值,有的为3,有的为4,哪个是正确? 34  *3.4 这样一个巧妙表达式:a^= b^= a^= b; 它不需要临时变量就可以交换a和b值。 34 3.5 可否用显式括号来强制执行我所需要计算顺序并...
  • 1:打印流(掌握) (1)针对字节和字符数据提供一个打印流的方式。 (2)打印流的特点: A:可以打印任意类型的数据 B:如果启用了自动刷新,在使用println方法的时候,会自动刷新,并且会自动... (3)案例:复制文本
  • LINGO软件学习

    2009-08-08 22:36:50
    一个派生集成员列表两种方式生成:①显式罗列;②设置成员资格过滤器。当采用方式①时,必须显式罗列出所有要包含在派生集中成员,并且罗列每个成员必须属于稠密集。使用前面例子,显式罗列派生集成员:...
  • 1、java中有哪些基本类型? 13 2、java为什么能够跨平台运行? 13 3、String是基本数据类型吗?我可不可以写个类继承于String? 14 4、谈谈&和&&区别? 14 5、Switch语句里面条件可不可以是byte、long、String?...
  • flash shiti

    2014-03-14 10:32:41
    4. Library 中一元件Symbol 1,舞台上一个该元件实例。现通过实例属性检查器将该实 例颜色改为#FF0033,透明度改为80%。请问此时Library 中Symbol 1 元件将会发生什么 变化? □ A. 颜色也变为#FF0033 □ ...
  • 这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里ID 是自动生成号码): SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"  注意:以上...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    2.17 什么容易显示枚举值符号方法? . . . . . . . . . . . . . . . 11 3 表达式13 3.1 为什么这样代码: a[i] = i++; 不能工作? . . . . . . . . . . . . 13 3.2 使用我编译器,下面代码int i=7; printf...
  • 引起LNK2001常见错误都有哪些 如何调试Windows外壳扩展程序(Shell Extension) 如何调试一个没有原码exe文件调用 dll 怎样设置栈大小 如何知道GetLastError()返回错误代码意义 如何使用Visual C++ 6.0...
  • 【繁简转换】 可视化繁简体GB与BGK码以及GB2与BIG5码相互转换,可以复制文本到当前窗体中文本进行转换,也可以实现单个文件或批量文件转换。在窗体中双击文本字符串尾即可实现自动选定文本并自动复制功能。本...
  • coreutils-8.32.tar.gz

    2020-04-30 13:16:46
    Coreutils 软件包包括一整套基本 shell 工具。 basename 去掉文件名中目录和后缀 cat 把文本文件内容发送...显示有哪些用户登录 whoami 打印当前用户有效用户标志符 yes 重复输出"y"字符,直到被杀死。
  • Java面试宝典2010版

    2011-06-27 09:48:27
    4、编程用JAVA解析XML的方式. 5、XML文档定义几种形式?它们之间何本质区别?解析XML文档哪几种方式? 七. 流行的框架与新技术 1、谈谈你对Struts的理解。 2、谈谈你对Hibernate的理解。 3、AOP的作用。 ...
  • 很多时候,一个个添加商品是很繁琐功能,对于参数基本相同商品更是麻烦,因此,商品复制功能正是满足了用户这种需要,可以对已添加好商品进行复制,然后进行局部修改,是一种非常方便添加商品方法!...
  • PowerPoint.2007宝典 8/10

    2012-04-01 18:39:23
    1.2.3 图形和文本的样式 9 1.2.4 更多图形与照片格式化选择 9 1.2.5 更多文本格式化选项 10 1.2.6 颜色、字体和效果主题 10 1.2.7 SmartArt 11 1.2.8 更出色的图表工具 12 1.2.9 自定义幻灯片版式 13 ...
  • 网趣商城ASP源码

    2013-02-17 17:11:35
    很多时候,一个个添加商品是很繁琐功能,对于参数基本相同商品更是麻烦,因此,商品复制功能正是满足了用户这种需要,可以对已添加好商品进行复制,然后进行局部修改,是一种非常方便添加商品方法!...
  • Java程序员面试宝典pdf

    热门讨论 2013-02-21 13:06:13
    面试题146 依赖注入的方式有哪些 259 面试题147 如何使用Spring的声明式事务 262 面试题148 如何在Web应用程序中整合Struts、Spring和Hibernate 264 13.4 小结 266 第14章 EJB与JPA相关问题( 教学视频:51分钟) ...
  • visio教程PDF

    热门讨论 2010-05-17 23:56:22
    1.3.3 获得Visio支持的方式 1.4 Visio的功能 1.5 标准的SmartShape模板 1.5.1 Block Diagrams 1.5.2 Flowcharts 1.5.3 Forms and Charts 1.5.4 Maps 1.5.5 Network Diagrams 1.5.6 Office ...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    4、编程用JAVA解析XML的方式. 115 5、XML文档定义几种形式?它们之间何本质区别?解析XML文档哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 ...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

复制文本的方式有哪些