会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132832个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/智能电话本项目实战 1758楼

老师你好,我这个为什么前面输出的是编码,后面就是乱码了?图片我是在网上随便找了一张

package yx.sudayIo;

import java.io.*;

public class FirstDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = null;
            try {
                fis = new FileInputStream("/Users/yangxi/Desktop/zx.png");
                StringBuffer sb = new StringBuffer();
                int temp;
                while ((temp = fis.read()) != -1){
                    System.out.println(temp);
                    sb.append((char)temp);
                }
                System.out.println(sb.toString());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    if(fis != null){
                        fis.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1759楼

package cn.work.com.bjsxt2.netWork;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

//发送信息线程
class send extends Thread {
    private Socket socket;
    private Scanner scanner;
    public send(Socket socket , Scanner scanner){
        this.socket = socket;
        this.scanner = scanner;
    }

    @Override
    public void run() {
        this.sendMsg();
    }

    private void sendMsg(){
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(this.socket.getOutputStream());
            while (true){
                String str = scanner.nextLine();
                pw.println(str);
                pw.flush();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(pw != null){
                    pw.close();
                }
                if(socket != null){
                    socket.close();
                }
                if(scanner != null){
                    scanner.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
//接收信息线程
class receive extends Thread{
    private Socket socket;
    public receive (Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        this.receiveMsg();
    }

    private void receiveMsg(){
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            while (true){
                String str = br.readLine();
                System.out.println("他说:"+str);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
                try {
                    if(br != null){
                    br.close();}
                } catch (IOException e) {
                    e.printStackTrace();
                }

            if(this.socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


//主方法
public class goodTCP13 {
    public static void main(String[] args) {
        Scanner scanner = null;
        ServerSocket serverSocket = null;
        Socket socket = null;
        try{
            scanner = new Scanner(System.in);
            System.out.println("请输入:server,<port>或者:IP,<port>");
            String str = scanner.nextLine();
            String [] arr = str.split(",");
            if("server".equals(arr[0])){
                //启动服务端
                System.out.println("TCP Server Listen at"+arr[1]+".......");
                serverSocket = new ServerSocket(Integer.parseInt(arr[1]));
                socket = serverSocket.accept();
                System.out.println("连接成功!");
            }else {
                //启动客户端
                socket = new Socket(arr[0],Integer.parseInt(arr[1]));
                System.out.println("连接成功!");
            }
            //启动发送消息线程
            new send(socket,scanner).start();
            //启动接收消息线程
            new receive(socket).start();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

老师帮我看一下

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 1762楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 1764楼

public class TestShowMsg {

    public static void main(String[] args) {

        ShowMsg sm = new ShowMsg();
        Generic3<Integer> g = new Generic3<>();
        sm.showFlag(g); // null 这里null 是因为这时候Generic3的对象没有任何值为空
        g.setFlag(20); // 为Generic3中的flag赋值20
        sm.showFlag(g); // 20 将Generic3对象g传入
       /*
        Generic3<Number> g2 = new Generic3<>();
        sm.showFlag(g2);
        g.getFlag(50);
        sm.showFlag(g);
        这里都报错的原因是泛型只确定了你要使用的类型或者类型识别,不考虑继承关系,只看类型!!
*/

        System.out.println("=============================================");
        Generic3<Integer> g2 = new Generic3<>();
        sm.showFlag(g2); 
        g2.setFlag(30); 
        sm.showFlag(g2); 
        Generic3<Number> g3 = new Generic3<>();
        sm.showFlag2(g3); // 因为showFlag2(Generic3<?> generic3)的参数泛型是? 任意类型 所以这里不会报错
        g3.setFlag(50);
        sm.showFlag2(g3);


    }
}
class ShowMsg{
    public void showFlag(Generic3<Integer> generic3){  // 这里传入的参数是Generic3对象 泛型类型定义为Integer
        System.out.println(generic3.getFlag());
    }

    // ? 无界通配符
    public void showFlag2(Generic3<?> generic3){  // 不能确定传入的是什么类型时 泛型类型定义为? 任意类型都可以
        System.out.println(generic3.getFlag());
    }
}

class Generic3<T>{
    private T flag;

    public T getFlag() {
        return flag;
    }

    public void setFlag(T flag) {
        this.flag = flag;
    }
}

老师,我这样理解对吗?

然后还有两个问题:

1、为什么传入参数Generic3<T> generic会报错?  我创建的泛型类是Generic3<T>,T不是表示简单的JAVA类么,

为什么传参时不可以使用?

public void showFlag(Generic3<T> generic3){  
    System.out.println(generic3.getFlag());
}

2、T是简单JAVA类 ?是任意类型 那这里用?作为传入参数的泛型,会不会出现超出T表示的范围?

public void showFlag2(Generic3<?> generic3){  
        System.out.println(generic3.getFlag());
    }


JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 1767楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637