Java RandomAccessFile的读取问题

代码如下:
public static void main(String[] args) {
//(十) 使用随机文件流类RandomAccessFile将一个文本文件倒置读出。
File file = new File("ma.dat");

     try {
        RandomAccessFile raf = new 
                 RandomAccessFile(file,"r");
        //???
        int b=raf.read();
        System.out.println(b);
        /*int b  = raf.readByte();

        System.out.println(b);*/

        int c=raf.readByte();
        System.out.println(c);
        int d=raf.readByte();
        System.out.println((char)d);

        char  ch = '建';
        System.out.println(Integer.toBinaryString(ch));
        //101111011111010

    } catch (FileNotFoundException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }



}

然后ma.dat里的内容是:

建2ield&*@`

中文乱码
如何解决?

打印到控制台的结果是:
189
-88
2
101111011111010

为什么结果是189,-88???后面的2和101111011111010我懂。就是不懂前面二个结果?求大牛解答!感激不尽!

qq_36142320
HermioneZhou 还有就是RandomAccessFile的read方法和readByte方法不是一回事吗??
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
RandomAccessFile 读取一行 为什么每一行都会少2个字节,
RandomAccessFile 读取一行 为什么每一行都会少2个字节,每一行读取出来的字节要少于原文件,怎么解决呀!还有怎么解决断点续读的问题呀
【求助】代码问题,关于RandomAccessFile类的定长写入读取
正在做一个交作业用的本地小型数据库,在删除属性的部分,听老师的建议把原来的内容用新内容覆盖。但在关于定长写入读取的部分有了错误。代码如下 写入部分: ``` for (int i = 0; i < num; i++) {//写入定长属性名 randoms.writeBytes(RandomAccessFiles.format(attris[i], 20, attris[i].length())); } randoms.write("\r\n".getBytes()); for (int i = 0; i < num; i++) {//写入定长类型 randoms.writeBytes(RandomAccessFiles.format(types[i], 10, types[i].length())); } randoms.write("\r\n".getBytes()); for (int i = 0; i < num; i++) {//写入长度 randoms.writeInt(length[i]); } randoms.write("\r\n".getBytes()); for (int i = 0; i < num; i++) {//写入是否主键 randoms.writeBoolean(key[i]); } randoms.write("\r\n".getBytes()); for (int i = 0; i < num; i++) {//写入是否允许空值 randoms.writeBoolean(isnull[i]); } randoms.write("\r\n".getBytes()); randoms.close(); ``` 这是读取和替换的部分,指针位置是没问题的。value里保存删除后的新内容,最后一并写入 ``` int x = 0; byte[] b = new byte[20]; for (int i = 0; i < num; i++) { random.read(b, 0, 20); if (new String(b).trim().equals(attri)) { //查找属性名 x = i; }else { value.append(new String(b)); } } random.readLine();//将换行符读掉 value.append("\r\n"); s = random.readLine();//类型组 System.out.println(s.length()); System.out.println(s); s = s.substring(0 ,x*10) + s.substring((x + 1)*10, s.length()); //数据类型 //System.out.println(s); value.append(s + "\r\n"); s = random.readLine(); System.out.println(s.length()); s = s.substring(0 ,x*4) + s.substring((x + 1)*4, s.length()); //数据长度 //System.out.println(s); value.append(s + "\r\n"); s = random.readLine(); System.out.println(s.length()); s = s.substring(0, x) + s.substring(x + 1, s.length()); //是否key //System.out.println(s); value.append(s + "\r\n"); s = random.readLine(); System.out.println(s.length()); s = s.substring(0, x) + s.substring(x + 1, s.length()); //是否null //System.out.println(s); value.append(s + "\r\n"); ``` 因为属性组、长度组、标志组都是定长的,删除的时候也只要定长搜索到要删除的属性是第几个,然后用substring方法就可以越过被删除的数据。但是后续测试中发现,substring方法偶尔会出现越界、偶尔不会,但删除了非对应属性的类型。尤其在读取长度那里,用readline方法读取后输出长度,(测试时输入了4个属性,writeInt应该写入四个4字节长度),竟然是9?顿时迷茫了,有大神帮帮忙,检查一下代码吗?
RandomAccessFile中read()方法的返回值
RandomAccessFile raf= new RandomAccessFile("D:/fis2.txt","rw"); raf.write(100); raf.seek(0); int a=raf.read(); System.out.println(a);//输出 100 raf.close(); 之前所了解到的知识是: read()方法返回值是所读取到byte的个数 以上的返回值如何理解?
java读取日志文件,遇到读出空字符串问题
我从网上找了个倒序读取文件的代码,我自己测试读自己创建的文件,可以读出内容,但是读真正生成的日志文件,读出的都是空字符串,程序没有报错。 个人测试了应该是和文件内容有关,但找不出原因所在,代码如下: package cn.cmts.control.util; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * http://bbs.csdn.net/topics/190181198 从最后一行开始读取 */ public class test { /** * * @param filename * 目标文件 * @param charset * 目标文件的编码格式 */ public static void read(String filename, String charset) { RandomAccessFile rf = null; try { rf = new RandomAccessFile(filename, "r"); long len = rf.length(); long start = rf.getFilePointer(); long nextend = start + len - 1; String line; rf.seek(nextend); int c = -1; int count =0; while (nextend > start) { c = rf.read(); if (c == '\n' || c == '\r') { line = rf.readLine(); if (line != null) { String info = new String(line.getBytes("ISO-8859-1"), charset); count+=1; System.out.println(count); if (info.contains("是的")) { System.out.println(count+":::"+new String(line.getBytes("ISO-8859-1"), charset)); break; } if (count>100) { break; } } else { System.out.println(line); } nextend--; } nextend--; rf.seek(nextend); if (nextend == 0) {// 当文件指针退至文件开始处,输出第一行 // System.out.println(rf.readLine()); System.out.println(new String(rf.readLine().getBytes("ISO-8859-1"), charset)); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (rf != null) rf.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String args[]) throws FileNotFoundException { read("e:\\apache-tomcat-8.5.13-windows-x64\\apache-tomcat-8.5.13\\logs\\localhost_access_log.2017-04-21.txt", "GB2312"); } }
多线程加上断点下载多个文件文件出现问题了
``` package cn.com.sinosoft.sfjy.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import java.util.Set; public class DonwloadUtil { public static Map<FileName, DownloadVo> map; public DonwloadUtil(Map<FileName, DownloadVo> map) { DonwloadUtil.map = map; being(); } public void being() { System.out.println("++++++++++++++++++++++++++++++++++++++++++++"); Set<FileName> keySet = map.keySet(); for (FileName fileName : keySet) { map.get(fileName).setFinished(donwload(fileName)); } System.out.println("++++++++++++++++++++++++++++++++++++++++++++"); } public boolean donwload(FileName filename) { // 发送get请求,请求这个地址的资源 try { // 构建请求路径 URL url = new URL(DonwloadUtil.map.get(filename).getDonwloadPath()); // 发送连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 请求方式 conn.setRequestMethod("GET"); // 请求连接超时 conn.setConnectTimeout(5000); // 连接中超时 conn.setReadTimeout(5000); // 请求连接成功 200 if (conn.getResponseCode() == 200) { // 拿到所请求资源文件的长度 long length = conn.getContentLength(); File file = new File(DonwloadUtil.map.get(filename).getTargetPath() + "/" + DonwloadUtil.map.get(filename).getFileName()); // 生成临时文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); // 设置临时文件的大小 raf.setLength(length); raf.close(); // 计算出每个线程应该下载多少字节 long size = length / DonwloadUtil.map.get(filename).getThreadCount(); for (int i = 0; i < DonwloadUtil.map.get(filename).getThreadCount(); i++) { // 计算线程下载的开始位置和结束位置 long startIndex = i * size; long endIndex = (i + 1) * size - 1; // 如果是最后一个线程,那么结束位置写死 if (i == DonwloadUtil.map.get(filename).getThreadCount() - 1) { endIndex = length - 1; } System.out.println(filename+"线程" + i + "的下载区间是:" + startIndex + "---" + endIndex); new DownLoadThread(startIndex, endIndex, i, filename).start(); } } return true; } catch (Exception e) { e.printStackTrace(); return false; } } } class DownLoadThread extends Thread { long startIndex; long endIndex; int threadId; FileName filename; public DownLoadThread(long startIndex, long endIndex, int threadId, FileName filename) { super(); this.startIndex = startIndex; this.endIndex = endIndex; this.threadId = threadId; this.filename = filename; } @Override public void run() { try { // 存放当前线程的下载进度文件 File progressFile = new File(filename+""+threadId + ".txt"); // 判断进度临时文件是否存在 if (progressFile.exists()) { FileInputStream fis = new FileInputStream(progressFile); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); // 从进度临时文件中读取出上一次下载的总进度,然后与原本的开始位置相加,得到新的开始位置 startIndex += Integer.parseInt(br.readLine()); fis.close(); } // System.out.println("线程" + threadId + "的下载区间是:" + startIndex + // "---" + endIndex); // 再次发送http请求,下载原文件 HttpURLConnection conn; URL url = new URL(DonwloadUtil.map.get(filename).getDonwloadPath()); // 发送连接 conn = (HttpURLConnection) url.openConnection(); // 请求方式 conn.setRequestMethod("GET"); // 请求连接超时 conn.setConnectTimeout(5000); // 连接中超时 conn.setReadTimeout(5000); // 设置本次http请求所请求的数据的区间 conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex); //System.out.println(filenaem+conn.getResponseCode()); // 请求部分数据,相应码是206 if (conn.getResponseCode() == 206) { // 流里此时只有1/3原文件的数据 InputStream is = conn.getInputStream(); byte[] b = new byte[1024]; int len = 0; int total = 0; // 拿到临时文件的输出流 File file = new File(DonwloadUtil.map.get(filename).getTargetPath() + "/" + DonwloadUtil.map.get(filename).getFileName()); // 生成临时文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); // 把文件的写入位置移动至startIndex raf.seek(startIndex); while ((len = is.read(b)) != -1) { // 每次读取流里数据之后,同步把数据写入临时文件 raf.write(b, 0, len); total += len; System.out.println(filename+"线程" + threadId + "下载了" + total); // 生成一个专门用来记录下载进度的临时文件 RandomAccessFile progressRaf = new RandomAccessFile(progressFile, "rwd"); // 每次读取流里数据之后,同步把当前线程下载的总进度写入进度临时文件中 progressRaf.write((total + "").getBytes()); progressRaf.close(); } System.out.println(filename+"线程" + threadId + "下载完毕!"); raf.close(); DonwloadUtil.map.get(filename) .setFinishedThread(DonwloadUtil.map.get(filename).getFinishedThread() + 1); synchronized (DonwloadUtil.map.get(filename).getDonwloadPath()) { if (DonwloadUtil.map.get(filename).getFinishedThread() == DonwloadUtil.map.get(filename) .getThreadCount()) { for (int i = 0; i < DonwloadUtil.map.get(filename).getThreadCount(); i++) { File f = new File(filename+""+i+ ".txt"); f.delete(); } DonwloadUtil.map.get(filename).setFinishedThread(0); } } } } catch (Exception e) { e.printStackTrace(); } } } ```
写了个java多线程下载器,但只有文件的部分内容下载成功。求大神!
import java.net.*; import java.io.*; class Test { //定义文件大小 private static int fileLength; //定义文件保存路径 private static String fileDirection; //定义线程数量 private static int threadNum; //定义线程组 private static Threads[] threads; //定义资源下载路径 private static String webDirection; /** * 默认构造器 * */ public Test(){} /** * 构造器: * 初始化threadNum(线程数量),fileDirection(文件保存路径),webDirection(资源下载路径) * */ public Test(int threadNum, String fileDirection, String webDirection) { this.threadNum = threadNum; this.fileDirection = fileDirection; this.webDirection = webDirection; //初始化threads数量。 threads = new Threads[threadNum]; } public static void downLoad() throws Exception { URL url = new URL(webDirection); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept", "*/*"); conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, " + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Charset", "UTF-8"); //获取连接 conn.connect(); //输出连接响应代码 System.out.println(conn.getResponseCode()); //获得文件大小 fileLength = conn.getContentLength(); //关闭连接 conn.disconnect(); //设置每条线程下载部分的大小 int subLength = fileLength / threadNum + 1; //设置本地文件的大小 RandomAccessFile file = new RandomAccessFile(fileDirection, "rw"); file.setLength(fileLength); file.close(); //以循环的方式来开始每一条线程 for (int i = 0; i < threadNum; i++) { //计算每条线程的下载的开始位置 int startPoint = i * subLength; //每条线程使用一个RandomAccessFile进行下载 RandomAccessFile subFile = new RandomAccessFile(fileDirection, "rw"); //定位该线程的下载位置 subFile.seek(startPoint); //初始化该线程 threads[i] = new Threads(subLength, startPoint, subFile, webDirection); //启动线程 threads[i].start(); } } } class Threads extends Thread { //定义该线程的下载位置 private static int startPoint; //当前线程需要下载的文件块 private static RandomAccessFile subFile; //定义资源的下载路径 private static String webDirection; //定义当前线程需要下载的问文件大小 private static int subLength; //定义已下载文件字节数 private static int length; /** * 构造器: * 初始化sublength,startPoint,subFile,webDirection * */ public Threads(int sublength, int startPoint, RandomAccessFile subFile, String webDirection) { this.startPoint = startPoint; this.subLength = sublength; this.subFile = subFile; this.webDirection = webDirection; } @Override public void run() { try { URL url = new URL(webDirection); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(1000); conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, " + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Accept-Language", "zh-CN"); conn.setRequestProperty("Charset", "UTF-8"); conn.connect(); //获取一个输出流, InputStream input = conn.getInputStream(); //是输出流跳过startpoint字节,表明该线程只下载自己负责的那一部分文件块 input.skip(startPoint); byte[] buffer = new byte[1024]; int hasNext = 0; //读取网络数据,并写入本地文件 while (length < subLength && (hasNext = input.read(buffer)) != -1) { subFile.write(buffer, 0, hasNext); //累计该线程的下载的总大小 length += hasNext; } input.close(); subFile.close(); } catch (Exception e) { } } } public class ThreadsDownload { public static void main(String[] args)throws Exception { // TODO Auto-generated method stub Test test = new Test(2, "C:\\Users\\Administrator\\Desktop\\music.txt", "http://shcm09.baidupcs.com/file/59980bec5eb499787dc6888f8c769620?bkt=p3-140059980bec5eb499787dc6888f8c769620847e32380000000003bc&fid=2283488641-250528-388951467231009&time=1484371050&sign=FDTAXGERLBH-DCb740ccc5511e5e8fedcff06b081203-%2FRxhx4PSo2A2tg6emD0bGTEM5DQ%3D&to=sh09vb&fm=Nan,B,M,mn&sta_dx=956&sta_cs=5&sta_ft=txt&sta_ct=0&sta_mt=0&fm2=Nanjing02,B,M,mn&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=140059980bec5eb499787dc6888f8c769620847e32380000000003bc&sl=69926991&expires=8h&rt=pr&r=745301334&mlogid=314351329813847523&vuk=2283488641&vbdid=2298463801&fin=test.txt&fn=test.txt&slt=pm&uta=0&rtype=1&iv=0&isw=0&dp-logid=314351329813847523&dp-callid=0.1.1&csl=500&csign=Cfc%2B%2Bn4hgLFC3dLFpSY0MMKwS%2BE%3D"); test.downLoad(); }
String字符串转换成json格式并打印json数据。
执行到150行的时候,不抱错,也没有执行后面的语句,我想请教大神String转json格式然后存储到本地数据库,有什么办法。 package sql_conn; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import javax.swing.*; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class java_sql extends JFrame{ JTextArea jtf1,jtf2; JButton yellowbutton,bluebutton,redbutton,okbutton; private static String test_url="jdbc:jtds:sqlserver://192.168.5.14:1433;DatabaseName=EUCP5"; private static String test_user = "admin123"; private static String test_pwd = "abcd_12345"; private static Connection con = null; public static void main(String[] args) { // TODO Auto-generated method stub EventQueue.invokeLater(new Runnable() { @Override public void run() { // TODO Auto-generated method stub java_sql frame=new java_sql(); frame.setVisible(true); } }); } public java_sql(){ this.setTitle("EUCP_数据库连接调试工具"); this.setSize(600,600); okbutton=new JButton("提交"); okbutton.setVisible(true); /*按钮添加button1Handler监听*/ okbutton.addActionListener(new Button1Handler()); //add buttons to panel buttonPanel=new JPanel(); buttonPanel.add(okbutton); this.add(buttonPanel); } private class Button1Handler implements ActionListener{ public void actionPerformed(ActionEvent e){ try { java_sql sms=new java_sql(); //jtf2.setText(okbutton.getActionCommand()); //JOptionPane.showMessageDialog(null, e.toString(), "alter", JOptionPane.ERROR_MESSAGE); sms.send_middle("177612309","验证码是48907"); } catch (Exception ex) { //JOptionPane.showMessageDialog(null, ex.toString(), "alter", JOptionPane.ERROR_MESSAGE); } } } private JPanel buttonPanel; public static int send_middle(String url, String param) throws MalformedURLException, UnsupportedEncodingException { String inputLine = ""; int value = -2; String con; DataOutputStream out = null; //InputStream in = null; String strUrl="http://eucpwx.mb345.com:443/AppApi/User/GetUserList?"; String strparam = "UserID=SU0126&GetType=1&NowID=&GetNum=100&Other=&SearchUserName="; try { System.out.println("start"); inputLine = sendPost(strUrl, strparam); //value = new Integer(inputLine).intValue(); System.out.println(inputLine); String str=String.valueOf(inputLine); //JSONObject st = JSONObject.fromObject(str); JSONObject jsonObject = new JSONObject().fromObject(str.toString()); System.out.println("可以"); Object data=jsonObject.get("UserID"); jsonObject = new JSONObject().fromObject(data.toString()); data=jsonObject.get("data"); jsonObject = new JSONObject().fromObject(data.toString()); data=jsonObject.get("value"); int value_k = Integer.parseInt(data.toString()); /* Statement stmt = null; String strSQL = ""; String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; String dbURL="jdbc:slserver://192.168.5.14:1433;DatabaseName=EnterpriseSMS_Play"; String userName="admin"; String userPwd="abcd"; Class.forName(driverName); Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd); String sql = ""; //注意java对SQL Server发送的SQL语句中表名需要用[]包围 System.out.println("SQL 开始"); for (int i = 0; i < jsonArr.size(); i++) { userid[i] = jsonArr.getJSONObject(i).getString("userid"); username[i] = jsonArr.getJSONObject(i).getString("username"); mobile[i] = jsonArr.getJSONObject(i).getString("mobile"); Avatar[i] = jsonArr.getJSONObject(i).getString("Avatar"); sql = "INSERT into user_bak (userid, username, mobile, Avatar) values('"+userid[i]+"','" +username[i]+"','"+mobile[i]+ "','"+Avatar[i]+"');"; System.out.println(sql.toString()); PreparedStatement statement = null; statement = dbConn.prepareStatement(sql); ResultSet rs = statement.executeQuery(); rs.close(); statement.close(); dbConn.close(); File f = new File("log.txt"); if (!f.exists()) { f.createNewFile(); } OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(f),"utf-8"); BufferedWriter writer=new BufferedWriter(write); writer.write(content); writer.close(); }*/ } catch (Exception e) { //System.out.println(e.toString()); value = -2; } //System.out.println(String.format("返回值:%d", value)); return value; } /** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(param); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { //System.out.println(line); //String send_line =URLEncoder.encode(line.toString(), "utf-8"); //JOptionPane.showMessageDialog(null, line.toString(), "alter", JOptionPane.ERROR_MESSAGE); //System.out.println(line.toString()); result += line; //System.out.println(result.toString()); } } catch (Exception e) { //System.out.println("发送 POST 请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } } ![图片说明](https://img-ask.csdn.net/upload/201709/04/1504509813_211448.png)
Android 求帮忙看看这段程序错在哪 在Android虚拟机上运行停止
package com.example.change1; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { /** Called when the activity is first created. */ Button btnSimpleDraw, btnTimerDraw; SurfaceView sfv; SurfaceHolder sfh; private Timer mTimer; private MyTimerTask mTimerTask; int Y_axis[],//保存Y轴上的点 centerY,//中心线 oldX,oldY,//上一个XY点 currentX;//当前绘制到的X轴上的点 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSimpleDraw = (Button) this.findViewById(R.id.drawbotton); btnTimerDraw = (Button) this.findViewById(R.id.timerbotton); btnSimpleDraw.setOnClickListener(new ClickEvent()); btnTimerDraw.setOnClickListener(new ClickEvent()); sfv = (SurfaceView) this.findViewById(R.id.surfaceview); sfh = sfv.getHolder(); //动态绘制 mTimer = new Timer(); mTimerTask = new MyTimerTask(); String string = ""; String mString = null; //File file = new File("/mnt/sdcard/abc.txt");//读取txt中数据 try { FileInputStream fis=new FileInputStream(Environment.getExternalStorageDirectory()+"/abc.txt"); byte buffer[]=new byte[1024]; ByteArrayOutputStream baops=new ByteArrayOutputStream(); int length=0; try { while((length=fis.read(buffer))!=-1){ baops.write(buffer, 0, length); string=baops.toString(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //RandomAccessFile randomAccessFile = null; // try { // // //randomAccessFile = new RandomAccessFile(file,"rw"); // } catch (FileNotFoundException e) { // // TODO 自动生成的 catch 块 // e.printStackTrace(); // } // try { // while((mString=randomAccessFile.readLine())!= null) ; // // System.out.println(mString+"只拿去了"); // string += mString; // } catch (Exception e) { // // TODO: handle exception // } String[] strings = string.split(","); int[] array = new int[strings.length]; for(int i=0;i<array.length;i++){ if(strings[i]=="" || strings[i].equals("")){ }else{ array[i] = Integer.valueOf(strings[i]); } } // 初始化y轴数据 centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv .getTop()) / 2; Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()]; for (int i = 1; i < Y_axis.length; i++) {// array中的数据复制给Y_axis Y_axis[i-1] = array[i]; } } class ClickEvent implements View.OnClickListener { //点击事件 @Override public void onClick(View v) { if (v == btnSimpleDraw) { SimpleDraw(Y_axis.length-1);//直接绘制 } else if (v == btnTimerDraw) { oldY = centerY; mTimer.schedule(mTimerTask, 0, 5);//动态绘制 } } } class MyTimerTask extends TimerTask { @Override public void run() { SimpleDraw(currentX); currentX++;//往前进 if (currentX == Y_axis.length - 1) {//如果到了终点,则清屏重来 ClearDraw(); currentX = 0; oldY = centerY; } } } /* * 绘制指定区域 */ void SimpleDraw(int length) { if (length == 0) oldX = 0; Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length, getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布 Log.i("Canvas:", String.valueOf(oldX) + "," + String.valueOf(oldX + length)); Paint mPaint = new Paint(); mPaint.setColor(Color.GREEN);// 画笔为绿色 mPaint.setStrokeWidth(2);// 设置画笔粗细 int y; for (int i = oldX + 1; i < length; i++) {// 绘画正弦波 y = Y_axis[i - 1]; canvas.drawLine(oldX, oldY, i, y, mPaint); oldX = i; oldY = y; } sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像 } void ClearDraw() { Canvas canvas = sfh.lockCanvas(null); canvas.drawColor(Color.BLACK);// 清除画布 sfh.unlockCanvasAndPost(canvas); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
这个实例怎么改才能让其正常运行
package IODemo; /*向文件中写入10个数据,第i个数据=圆周率*i(i=0,1,2,...,9),然后将第二个(i=2)改为 0,最后将10个数据全部输出*/ import java.io.IOException; import java.io.RandomAccessFile; public class TestFileRAF { public static void main(String[] args){ try{ RandomAccessFile f=new RandomAccessFile("TestFileRAF.txt","rw"); int i; double d; //写:向文件写入10个数据 for(i=0;i<10;i++){ //f.writeDouble()写入double数据的方法 f.writeDouble(Math.PI*i); //修改:对文件中第2个double数据改为0 f.seek(16);//文件针往前走16个字节(2个double数据);seek:寻找 f.writeDouble(0); f.seek(0);//文件指针回到文件首部 //读取:将全部数据独处并打印到屏幕中 for(i=0;i<10;i++){ d=f.readDouble(); System.out.println("["+i+"]:"+d); } f.close(); } }catch (IOException e){ System.err.println("发现异常:"+e); e.printStackTrace(); } } } ![图片说明](https://img-ask.csdn.net/upload/201605/07/1462610917_438600.jpg)
纯真数据库dat文件无法实例问题
``` private IPSeeker() { ipCache = new Hashtable(); loc = new IPLocation(); buf = new byte[100]; b4 = new byte[4]; b3 = new byte[3]; try { ipFile = new RandomAccessFile(IP_FILE, "r"); } catch (FileNotFoundException e) { System.out.println(IPSeeker.class.getResource("QQWry.dat") .toString()); System.out.println(IP_FILE); System.out.println("IP地址信息文件没有找到,IP显示功能将无法使用"); ipFile = null; } // 如果打开文件成功,读取文件头信息 if (ipFile != null) { try { ipBegin = readLong4(0); ipEnd = readLong4(4); if (ipBegin == -1 || ipEnd == -1) { ipFile.close(); ipFile = null; } } catch (IOException e) { System.out.println("IP地址信息文件格式有错误,IP显示功能将无法使用"); ipFile = null; } } } /** * @return 单一实例 */ public static IPSeeker getInstance() { return instance; } ``` 网上找的一个QQ的纯真数据库IP文件, 在我的机器上都行,放别人机器上实例失败没找到qqwry文件,, 文件和class类放一个包里, 求问这么解决 ,
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?
前两天又有小伙伴私信松哥,问题还是职业规划,Java 技术栈路线这种,实际上对于这一类问题我经常不太敢回答,每个人的情况都不太一样,而小伙伴也很少详细介绍自己的情况,大都是一两句话就把问题抛出来了,啥情况都不了解,就要指出一个方向,这实在是太难了。 因此今天我想从我学习 Spring Boot + Vue 这套技术栈的角度,来和大家聊一聊没有人指导,我是如何一步一步建立起自己的技术体系的。 线上大...
17张图带你解析红黑树的原理!保证你能看懂!
二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任意结点的...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | gr...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问