怎么样在Java中声明一个一百万长度的数组

我想在Java中生成一个长度为一百万的数组,但是java中索引数只能是int型

4个回答

还是用列表吧,或者map,考虑是否一定要提前申请这么大的空间,如果不是必须,就考虑用动态的,满足需要即可

100万对于int没有压力
int[] arr = new int[1000000];

int轻轻松松100万啊 int的范围在负的21亿多到正的21亿多

java的int的最大值是2147483647,没有问题

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
JAVA数组大小与JVM内存的关系
记得学习数组的时候数组应该是连续的内存空间,java中也应该是连续空间吧?如果声明个JAVA对象数组的大小(长度)超过了JVM中连续内存的大小怎么办?内存整理还是溢出?..
数组的length获取的是实际长度还是声明长度
int[] arr = new int[10]; arr[0] = 1;其他都是null arr.length结果是10还是1 如何获取实际长度呢?
C初始化数组有些不清楚
自己作死,看到java初始化数组过程中说道: > int[] a = new int[5]; //分配了长度是5的数组,但是没有赋值 > 没有赋值,那么就会使用默认值 > 作为int类型的数组,默认值是0 就这个问题纠结了好半天,C如果只声明不初始化会怎么样呢? 于是: ```c int main(void) { int a[5]; int i; for(i=0;i<5;i++) { printf("-->%d\n",a[i]); } } ``` 结果输出: > -->3 -->0 -->38 -->0 -->0 这是怎么回事?不会自动初始化为0吗? 求大神解答
那位大神能把我这个Java的md5的加密方法写个php版本哦,感激噢!
那位大神能把我这个Java的md5的加密方法写个php版本哦,感激噢,Java代码如下! 写这个的人 描述的思路如下 1.将秘钥、源串分别转换byte数组 2.声明2个64位数组 将key的byte数组分别做异或运算填充进去 并分别补充 54、92 补满64长度 3.获得md5摘要算法的MessageDigest 对象 4.使用其中一个数组及源串的数组更新MessageDigest 摘要 完成哈希计算 5.重置摘要 6.使用另一个数组更新摘要 使用4中结果 从0到16开始更新摘要 完成哈希计算 7.转换字符串 public String cryptMd5(String source, String key) { byte[] k_ipad = new byte[64]; byte[] k_opad = new byte[64]; byte[] keyb; byte[] value; try { byte[] keyb = key.getBytes("UTF-8"); value = source.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { byte[] value; keyb = key.getBytes(); value = source.getBytes(); } Arrays.fill(k_ipad, keyb.length, 64, 54); Arrays.fill(k_opad, keyb.length, 64, 92); for (int i = 0; i < keyb.length; i++) { k_ipad[i] = (byte)(keyb[i] ^ 0x36); k_opad[i] = (byte)(keyb[i] ^ 0x5C); } MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { return null; } md.update(k_ipad); md.update(value); byte[] dg = md.digest(); md.reset(); md.update(k_opad); md.update(dg, 0, 16); dg = md.digest(); return toHex(dg); } public static String toHex(byte[] input) { if (input == null) { return null; } StringBuffer output = new StringBuffer(input.length * 2); for (int i = 0; i < input.length; i++) { int current = input[i] & 0xFF; if (current < 16) output.append("0"); output.append(Integer.toString(current, 16)); } return output.toString(); }
getDeclaredMethods方法为什么会拿到父类的方法?
spublic Method[] getDeclaredMethods() throws SecurityException返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。 下面一段代码在Sausage 写了两个方法,其中一个是重写了父类的getIngredient() 方法。Sausage.class.getDeclaredMethods()却返回了三个方法,包括两个getIngredient() 和他自己的showDescription()方法,请问这是为什么?为什么会拿到了父类的方法? [code="java"] import java.util.*; import java.lang.reflect.*; class Food{ private Object ingredient; public Object getIngredient(){ return ingredient; } public void showDescription(){ } } class Sausage extends Food{ private ArrayList ingredient; public ArrayList getIngredient(){ return ingredient; } public void showDescription(){ System.out.println("I'm very delicious!"); } } class Test{ public static void main(String[] args) throws Exception{ Method[] ms = Sausage.class.getDeclaredMethods(); System.out.println(ms.length); } } [/code]
JAVA报错:Exception in thread "main"……求帮助?
题目要求: (1)创建MaxArray类:  声明1个一维数组的成员变量,例如:int array[ ]; //一维数组  设置有参构造方法,如:MaxArray(int n){ …… } //有参构造方法,为成员变量创建长为n的一维数组  设置无参构造方法:通过键盘输入数组长度n,然后为成员变量创建长度为n的数组。  设置修改数组元素值的成员方法:int setArray(){ …//输入数组各元素的值 }  设置查找并返回数组最大值的成员方法:int findMax( ){……}  设置输出数组所有元素的成员方法:void output( ){……} (2)创建主类CreateArray:生成MaxArray类对象,并调用相关成员方法求数组最大值,并输出。 代码块 ``` import java.util.*; class MaxArray{ int len; int array[]; //有参构造方法 MaxArray(int n){ len=n; int array[]=new int[len]; } //无参构造方法 MaxArray(){ Scanner num=new Scanner(System.in); len=num.nextInt(); int array[]=new int[len]; } //修改数组元素值的成员方法 void setArray(){ Scanner num=new Scanner(System.in); for(int i=0;i<len;i++){ array[i]=num.nextInt(); } } //查找并返回数组最大值的成员方法 int findMax(){ int max=array[0]; for(int i=0;i<len;i++){ if(array[0]<array[i]){ max=array[i]; } } return max; } //输出数组所有元素的成员方法 void output(){ for(int i=0;i<len;i++){ System.out.printf("\t"+array[i]); if(len%5==0){ System.out.println(); } } } } public class CreateArray { public static void main(String[] args) { // TODO Auto-generated method stub int max; //生成MaxArray类对象 MaxArray arr=new MaxArray(); arr.setArray(); arr.output(); max=arr.findMax(); System.out.println("the Max is:"+max); } } ``` 无论是调用有参构造方法还是无参构造方法都是这样报错: ![图片说明](https://img-ask.csdn.net/upload/201706/25/1498360766_353049.png) ![图片说明](https://img-ask.csdn.net/upload/201706/25/1498360776_677745.png) ![图片说明](https://img-ask.csdn.net/upload/201706/25/1498360787_689460.png) ![图片说明](https://img-ask.csdn.net/upload/201706/25/1498360800_738783.png) 请问是哪里出了问题
java连连看数字换图片后重列的问题
我有一个源代码,是只有数字的,然后我加入了调用图片并且修改了一点代码后 不知道为什么点击重列就有问题了。reload函数那里是不是缺了什么,拜托各位大神帮我解决一下了~~~小女子谢过~ 下面是我的代码: import javax.swing.*; //AWT的扩展 import java.awt.*; //抽象窗口工具包 import java.awt.event.*; import java.io.*; class lianliankan implements ActionListener //实现ActionListener接口 { JFrame mainFrame; //主面板 ,JFrame定义的是一个容器,可向里面添加组件 Container thisContainer; //定义一个容器 JPanel centerPanel,southPanel,northPanel; //子面板 ,JPanel是个轻量级容器,可添加入JFrame中 JButton diamondsButton[][] = new JButton[6][5];//定义存储游戏按钮的数组 JButton exitButton,resetButton,newlyButton; //定义退出,重列,重新开始按钮 JLabel fractionLable=new JLabel("0"); //定义分数标签,并初始化为0. JButton firstButton,secondButton; //分别记录两次先后被选中的按钮 int grid[][] = new int[8][7];//储存游戏按钮位置 static boolean pressInformation=false; // 声明了一个静态布尔类型的变量,判断是否有按钮被选中 int x0=0,y0=0,x=0,y=0,fristMsg=0,secondMsg=0,validateLV; //游戏按钮的位置坐标 int i,j,k,n;//消除方法控制 //调用图片// private static Icon[] icons=new ImageIcon[6*6]; private static final String imgDir="c:/宠物连连看"; static{ try { File dir=new File(imgDir); File[] imgFiles=dir.listFiles(new FilenameFilter(){ public boolean accept(File dir,String name){ return name.toLowerCase().endsWith(".jpg"); } }); for(int i=0;i<10*10;i++){ icons[i]=new ImageIcon(imgFiles[i].getAbsolutePath()); } }catch(Exception e){ e.printStackTrace(); } } public void init(){ //init方法 mainFrame=new JFrame("连连看"); //定义主面板为命名为“连连看”的JFrame容器 thisContainer = mainFrame.getContentPane(); //初始化mainFrame. thisContainer.setLayout(new BorderLayout()); //定义布局为东西南北中的形式 centerPanel=new JPanel(); //初始化centerPanel southPanel=new JPanel(); //初始化southPanel northPanel=new JPanel(); //初始化northPanel thisContainer.add(centerPanel,"Center"); //将centerPanel加入mainFrame中的Center位置 thisContainer.add(southPanel,"South"); //将southPanel加入mainFrame中的South位置 thisContainer.add(northPanel,"North"); //将northPanel加入mainFrame中的North位置 centerPanel.setLayout(new GridLayout(6,5)); //将centerPanel初始化为6*5的网格布局 for(int cols = 0;cols < 6;cols++){ //依次对第0列到第5列进行操作 for(int rows = 0;rows < 5;rows++ ){ //依次对第0行到第4行进行操作 diamondsButton[cols][rows]=new JButton(String.valueOf(grid[cols+1][rows+1]));//新建按钮 diamondsButton[cols][rows]=new JButton(icons[grid[cols+1][rows+1]-1]); diamondsButton[cols][rows].addActionListener(this);//向此按键添加动作监听以接收来自它的动作 centerPanel.add(diamondsButton[cols][rows]);//将按键添加到centerPanel中 } } exitButton=new JButton("退出"); //新建“退出”按钮 exitButton.addActionListener(this); //向“退出”按钮添加事件监听 exitButton.setPreferredSize(new Dimension(150, 50)); exitButton.setFont(new Font("黑体", Font.PLAIN, 25)); //exitButton.setForeground(Color.red); //exitButton.setBackground(Color.white); resetButton=new JButton("重列"); //新建“重列”按钮 resetButton.addActionListener(this); //向“重列”按钮添加事件监听 resetButton.setPreferredSize(new Dimension(150, 50)); resetButton.setFont(new Font("黑体", Font.PLAIN, 25)); newlyButton=new JButton("再来一局"); //新建“再来一局”按钮 newlyButton.addActionListener(this); //向“再来一局”按钮添加事件监听 newlyButton.setPreferredSize(new Dimension(150, 50)); newlyButton.setFont(new Font("黑体", Font.PLAIN, 25)); southPanel.add(exitButton); //将“退出”按钮添加到southPanel southPanel.add(resetButton); //将“重列”按钮添加到southPanel southPanel.add(newlyButton); //将“再来一局”按钮添加到southPanel fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText()))); northPanel.add(fractionLable); //将“分数”标签加入northPanel fractionLable.setPreferredSize(new Dimension(50,50)); fractionLable.setFont(new Font("黑体", Font.PLAIN, 25)); mainFrame.setBounds(280,100,1000,950); // x:X轴上的起点 ,y:Y轴上的起点 , width:长度, height:宽度 mainFrame.setVisible(true); //框架可见 } public void randomBuild() { int randoms,cols,rows; for(int twins=1;twins<=15;twins++) { randoms=(int)(Math.random()*25+1); //在1-25之间随机产生一个数字 for(int alike=1;alike<=2;alike++) { cols=(int)(Math.random()*6+1); //选中一个网格 rows=(int)(Math.random()*5+1); while(grid[cols][rows]!=0) { cols=(int)(Math.random()*6+1); //如果该格已经存在数字,则重新选择网格 rows=(int)(Math.random()*5+1); } this.grid[cols][rows]=randoms; //将随机产生的数字放入网格中 } } } public void fraction(){ fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())+100));//在原有数字上加100分 } public void reload() { int save[] = new int[30]; int n=0,cols,rows; int grid[][]= new int[8][7]; for(int i=0;i<=6;i++) { for(int j=0;j<=5;j++) { if(this.grid[i][j]!=0) { save[n]=this.grid[i][j]; //将现在任然存在的数字存入save中 n++; } } } n=n-1; this.grid=grid; while(n>=0) { cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); //重新选择格子 while(grid[cols][rows]!=0) { cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); //如果格子非空,则重新选择格子 } this.grid[cols][rows]=save[n];//将save中的数字放入所选择的的格子中 n--; } mainFrame.setVisible(false); pressInformation=false; //这里一定要将按钮点击信息归为初始 init(); //调用init for(int i = 0;i < 6;i++){ for(int j = 0;j < 5;j++ ){ if(grid[i+1][j+1]==0) //如果格子的值为0 diamondsButton[i][j].setVisible(false); //则按键不可见 } } } public void estimateEven(int placeX,int placeY,JButton bz) { if(pressInformation==false) //尚未有按键被选中 { x=placeX; y=placeY; secondMsg=grid[x][y]; //将该键的值存储到secondMsg secondButton=bz; //令secondButton为按下的键 pressInformation=true; //标示已经有键被选中 } else { //已经有按键被选中 x0=x; //将second中的值转存到first y0=y; fristMsg=secondMsg; firstButton=secondButton; x=placeX; y=placeY; //将该键存入second secondMsg=grid[x][y]; secondButton=bz; if(fristMsg==secondMsg && secondButton!=firstButton){ //如果两个格子数字相等且格子不相同 xiao(); //调用xiao方法 } } } public void xiao() { if((x0==x &&(y0==y+1||y0==y-1)) || ((x0==x+1||x0==x-1)&&(y0==y))){ //判断是否相邻 remove(); //调用remove } else{ for (j=0;j<7;j++ ) { if (grid[x0][j]==0){ //判断第一个按钮同行哪个按钮为空 if (y>j) { //如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边 for (i=y-1;i>=j;i-- ){ //判断第二按钮左侧直到第一按钮中间有没有按钮 if (grid[x][i]!=0) { k=0; break; } else{ k=1; } //K=1说明通过了第一次验证 } if (k==1) { linePassOne(); } } if (y<j){ //如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边 for (i=y+1;i<=j ;i++ ){ //判断第二按钮左侧直到第一按钮中间有没有按钮 if (grid[x][i]!=0){ k=0; break; } else { k=1; } } if (k==1){ linePassOne(); } } if (y==j ) { linePassOne(); } } if (k==2) { if (x0==x) { remove(); } if (x0<x) { for (n=x0;n<=x-1;n++ ) { if (grid[n][j]!=0) { k=0; break; } if(grid[n][j]==0 && n==x-1) { remove(); } } } if (x0>x) { for (n=x0;n>=x+1 ;n-- ) { if (grid[n][j]!=0) { k=0; break; } if(grid[n][j]==0 && n==x+1) { remove(); } } } } } for (i=0;i<8;i++ ) { //列 if (grid[i][y0]==0) { if (x>i) { for (j=x-1;j>=i ;j-- ) { if (grid[j][y]!=0) { k=0; break; } else { k=1; } } if (k==1) { rowPassOne(); } } if (x<i) { for (j=x+1;j<=i;j++ ) { if (grid[j][y]!=0) { k=0; break; } else { k=1; } } if (k==1) { rowPassOne(); } } if (x==i) { rowPassOne(); } } if (k==2){ if (y0==y) { remove(); } if (y0<y) { for (n=y0;n<=y-1 ;n++ ) { if (grid[i][n]!=0) { k=0; break; } if(grid[i][n]==0 && n==y-1) { remove(); } } } if (y0>y) { for (n=y0;n>=y+1 ;n--) { if (grid[i][n]!=0) { k=0; break; } if(grid[i][n]==0 && n==y+1) { remove(); } } } } } } } public void linePassOne(){ if (y0>j){ //第一按钮同行空按钮在左边 for (i=y0-1;i>=j ;i-- ){ //判断第一按钮同左侧空按钮之间有没按钮 if (grid[x0][i]!=0) { k=0; break; } else { k=2; } //K=2说明通过了第二次验证 } } if (y0<j){ //第一按钮同行空按钮在与第二按钮之间 for (i=y0+1;i<=j ;i++){ if (grid[x0][i]!=0) { k=0; break; } else{ k=2; } } } } public void rowPassOne(){ if (x0>i) { for (j=x0-1;j>=i ;j-- ) { if (grid[j][y0]!=0) { k=0; break; } else { k=2; } } } if (x0<i) { for (j=x0+1;j<=i ;j++ ) { if (grid[j][y0]!=0) { k=0; break; } else { k=2; } } } } public void remove(){ firstButton.setVisible(false); //第一个按键不可见 secondButton.setVisible(false); //第二个按键不可见 fraction(); //调用fraction, 在当前分数上加100分 pressInformation=false; //使该静态变量还原为false k=0; grid[x0][y0]=0; //清除该游戏按钮 grid[x][y]=0; //清除该游戏按钮 } public void actionPerformed(ActionEvent e) { if(e.getSource()==newlyButton){ //如果newlyButton产生动作 int grid[][] = new int[8][7]; //产生新的存储按键的数组 this.grid = grid; randomBuild(); //调用randomBuild mainFrame.setVisible(false); //使当前mainFrame不可见 pressInformation=false; //使该静态变量还原为false init(); //调用init } if(e.getSource()==exitButton) //如果exitButton产生动作 System.exit(0); //退出程序 if(e.getSource()==resetButton) //如果resetButton产生动作 reload(); //调用reload for(int cols = 0;cols < 6;cols++){ for(int rows = 0;rows < 5;rows++ ){ if(e.getSource()==diamondsButton[cols][rows]) //如果游戏按键产生动作 estimateEven(cols+1,rows+1,diamondsButton[cols][rows]); //调用estimateEven } } } public static void main(String[] args) { lianliankan llk = new lianliankan(); //初始化 llk.randomBuild(); //调用randomBuild llk.init(); //调用init } } ![图片说明](https://img-ask.csdn.net/upload/201606/18/1466244507_872958.png)
继续求助第二波,那位大神能把这个Java md5的方法写个php版的,得加密结果一致的,谢谢了!
继续求助第二波,那位大神能这个Java md5的方法写个php版的,得加密结果一致的,谢谢了,第一波有位达人写了一个了,但是加密结果不一样,大家可以参考下! java方法描述的思路如下 1.将秘钥、源串分别转换byte数组 2.声明2个64位数组 将key的byte数组分别做异或运算填充进去 并分别补充 54、92 补满64长度 3.获得md5摘要算法的MessageDigest 对象 4.使用其中一个数组及源串的数组更新MessageDigest 摘要 完成哈希计算 5.重置摘要 6.使用另一个数组更新摘要 使用4中结果 从0到16开始更新摘要 完成哈希计算 7.转换字符串 方法如下 public String cryptMd5(String source, String key) { byte[] k_ipad = new byte[64]; byte[] k_opad = new byte[64]; byte[] keyb; byte[] value; try { byte[] keyb = key.getBytes("UTF-8"); value = source.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { byte[] value; keyb = key.getBytes(); value = source.getBytes(); } Arrays.fill(k_ipad, keyb.length, 64, 54); Arrays.fill(k_opad, keyb.length, 64, 92); for (int i = 0; i < keyb.length; i++) { k_ipad[i] = (byte)(keyb[i] ^ 0x36); k_opad[i] = (byte)(keyb[i] ^ 0x5C); } MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { return null; } md.update(k_ipad); md.update(value); byte[] dg = md.digest(); md.reset(); md.update(k_opad); md.update(dg, 0, 16); dg = md.digest(); return toHex(dg); } public static String toHex(byte[] input) { if (input == null) { return null; } StringBuffer output = new StringBuffer(input.length * 2); for (int i = 0; i < input.length; i++) { int current = input[i] & 0xFF; if (current < 16) output.append("0"); output.append(Integer.toString(current, 16)); } return output.toString(); } 下面这个是上次提问达人写的,加密结果和Java的还是不一致 function cryptMd5($source, $key) { if(! mb_check_encoding($source, 'utf-8')) $source = mb_convert_encoding($source, "utf-8", "auto"); if(! mb_check_encoding($key, 'utf-8')) $key = mb_convert_encoding($key, "utf-8", "auto"); $k_ipad = str_pad($key, 64, chr(54)); $k_opad = str_pad($key, 64, chr(92)); for($i=0; $i<strlen($key); $i++) { $k_ipad{$i} = $key{$i} ^ chr(0x36); $k_opad{$i} = $key{$i} ^ chr(0x5c); } $dg = md5($source . substr($k_ipad, strlen($source)), true); $dg = md5(substr($dg, 0, 16) . substr($k_opad, 16), true); return bin2hex($dg); }
这是一个MD5加密工具类,登陆始终是失败的,我用相同的密码123456多次注册发现加密后的密码字符串都是不同的,是不是工具类有错误的原因?
``` package com.easy.demo.utils; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; /*这是一个非常好用的使用MD5+salt加密的工具类。使用这个工具类,非常简单, 从前台拿到密码password,直接HexUtil.getEncryptedPwd(password)就可以返回一个长度为56的字符串, 可以用来保存到数据库中,相反,登录的时候,因为MD5加密是不可逆的运算,只能拿用户输入的密码走一遍MD5+salt加密之后, 跟数据库中的password比较,看是否一致,一致时密码相同,登录成功,通过调用HexUtil.validpassword(String password,String dbpassword)方法, 就可以了,不用再做其他事。*/ public class MD5Util { private final static String HEX_NUMS_STR = "0123456789ABCDEF"; private final static Integer SALT_LENGTH = 12; /** * 将16进制字符串转换成数组 * * @return byte[] * @author jacob * */ public static byte[] hexStringToByte(String hex) { /* len为什么是hex.length() / 2 ? * 首先,hex是一个字符串,里面的内容是像16进制那样的char数组 * 用2个16进制数字可以表示1个byte,所以要求得这些char[]可以转化成什么样的byte[],首先可以确定的就是长度为这个char[]的一半 */ int len = (hex.length() / 2); byte[] result = new byte[len]; char[] hexChars = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR .indexOf(hexChars[pos + 1])); } return result; } /** * 将数组转换成16进制字符串 * * @return String * @author jacob * * */ public static String byteToHexString(byte[] salt){ StringBuffer hexString = new StringBuffer(); for (int i = 0; i < salt.length; i++) { String hex = Integer.toHexString(salt[i] & 0xFF); if(hex.length() == 1){ hex = '0' + hex; } hexString.append(hex.toUpperCase()); } return hexString.toString(); } /** * 密码验证 * @param password 用户输入密码 * @param dbpassword 数据库保存的密码 * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static boolean validpassword(String password, String dbpassword) throws NoSuchAlgorithmException, UnsupportedEncodingException{ byte[] pwIndb = hexStringToByte(dbpassword); //定义salt byte[] salt = new byte[SALT_LENGTH]; System.arraycopy(pwIndb, 0, salt, 0, SALT_LENGTH); //创建消息摘要对象 MessageDigest md = MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); md.update(password.getBytes("UTF-8")); byte[] digest = md.digest(); //声明一个对象接收数据库中的口令消息摘要 byte[] digestIndb = new byte[pwIndb.length - SALT_LENGTH]; //获得数据库中口令的摘要 System.arraycopy(pwIndb, SALT_LENGTH, digestIndb, 0,digestIndb.length); //比较根据输入口令生成的消息摘要和数据库中的口令摘要是否相同 if(Arrays.equals(digest, digestIndb)){ //口令匹配相同 return true; }else{ return false; } } /** * 获得md5之后的16进制字符 * @param password 用户输入密码字符 * @return String md5加密后密码字符 * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String getEncryptedPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //拿到一个随机数组,作为盐 byte[] pwd = null; SecureRandom sc= new SecureRandom(); byte[] salt = new byte[SALT_LENGTH]; sc.nextBytes(salt); //声明摘要对象,并生成 MessageDigest md = MessageDigest.getInstance("MD5"); //计算MD5函数 md.update(salt); //password.getBytes("UTF-8")将输入密码变成byte数组,即将某个数装换成一个16进制数 md.update(password.getBytes("UTF-8")); //计算后获得字节数组,这就是那128位了即16个元素 byte[] digest = md.digest(); pwd = new byte[salt.length + digest.length]; System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); return byteToHexString(pwd); } } //controller层实现登陆的代码 @RequestMapping(value={"/login"}, method=RequestMethod.GET) public boolean login(HttpServletRequest request, @Param(value = "number")String number, @Param(value = "password")String password) throws UnsupportedEncodingException, NoSuchAlgorithmException { password = HexUtil.getEncryptedPwd(password); User user = userMapper.loginUser(number,password); if(user != null){ return true; }else{ return false; } } ``` 密码输入多遍始终登陆失败,尝试注册相同密码发现,每次注册123456加密后的密码都不一样,是不是MD5工具类有错误?
java RandomAccessFile问题,求解答
raf = new RandomAccessFile(file, "rw"); //利用读写模式实例化随机文件 raf.seek(file.length()); //文件指针跳至文件尾,准备追加数据 byte b[] = new byte[16]; //声明数组,表示地名 StringBuffer sb = new StringBuffer(16); //实例化字符缓冲对象,长度为16B sb.replace(0, 16," "); //填充16个空格确保地名长度相同 sb.replace(0,nation.length()*2, nation);//把地名信息放在字符缓冲对象sb中 b = sb.toString().getBytes(); raf.write(b); raf.close(); 写入文件的内容不对啊,求大神解答
Java菜鸟问题之定义数据结构
我的leader让我定义一个数据结构! 有两个类:Package(属性:name、type、operation等等。方法包括:add,delete,以及对Field字段的添加、删除等功能方法)和Field(属性:name、type、operations等等,方法:add,delete等等)! 一个Package包含多个Field字段(也就是说组合关系!)他的要求是用类似c的struct+动态数组定义一个数据结构! 这里我不知道这个动态数组应该怎么加入!挺基础的一个设计!哪位大侠出出主意?呵呵 [b]问题补充:[/b] add,delete的作用:在Package对Field字段进行删除或者添加!原则还是Package包含(组合关系)多个Field字段,可以删除,添加某个字段! 我的设想是:Package类的某个属性为Field对象。这样二者就联系起来。 然后在声明一个class FiledCollection , 里面维护一个私有的HashTable, 用这个类的实例来保存一个个的FiledManager实例, Packagemanager也一样, 这样程序整洁, 扩展性强。关键就是这里的FieldCollection怎样写?小弟不懂啊! 给出示例代码吧! package cainiao; public class Package { private String name; private String type; private Field field; public Package(String name, String type, Field field) { this.name = name; this.type = type; this.field = field; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Field getField() { return field; } public void setField(Field field) { this.field = field; } } package cainiao; public class Field { private String name; private String type; private String operation; public Field(String name, String type, String operation) { this.name = name; this.type = type; this.operation = operation; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation; } } 不知描述清楚没?呵呵 [b]问题补充:[/b] 我的设想是:[color=red]Package类的某个属性为Field对象。这样二者就联系起来。 然后在声明一个class FiledCollection , 里面维护一个私有的HashTable, 用这个类的实例来保存一个个的FiledManager实例, Packagemanager也一样, [/color]这样程序整洁, 扩展性强。关键就是这里的FieldCollection怎样写?PackageCollection咋写?我的设想正确不? [b]问题补充:[/b] 我这个leader说的是struct+动态数组个数据结构定义!我就直接想用arraylist,这是我的个人想法,不过我就是不知道这个动态数组咋加进去?firefly兄你写出点代码出来看看!呵呵,我不知道咋写!他只是让我想。也没提示,说提示就没意思了!呵呵,哪位高人来提示一下! [b]问题补充:[/b] hashtable?哦,那是以前的想法!现在就是想用arraylist。 firefly你说的这个[color=red]:[color=orange]Java里面的ArrayList不仅是运行时指定长度,并且可以自增长。因此,说白了,ArrayList就是lz所说的“动态数组”。因此,lz直接使用ArrayList就可以,当然,也可以把ArrayList封装FieldCollection,然后在FieldCollection里面添加相应的add和delete方法。[/color][/color] 你能不能用代码实现啊!我不知如何下手! [b]问题补充:[/b] 好!你就ok了!多谢二位的回答!
我有md5加密工具类了,但是不会去调用,要在哪个层去调用?
![图片说明](https://img-ask.csdn.net/upload/201909/18/1568792334_186753.png) ``` package com.easy.demo.utils; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; /*这是一个非常好用的使用MD5+salt加密的工具类。使用这个工具类,非常简单, 从前台拿到密码password,直接HexUtil.getEncryptedPwd(password)就可以返回一个长度为56的字符串, 可以用来保存到数据库中,相反,登录的时候,因为MD5加密是不可逆的运算,只能拿用户输入的密码走一遍MD5+salt加密之后, 跟数据库中的password比较,看是否一致,一致时密码相同,登录成功,通过调用HexUtil.validpassword(String password,String dbpassword)方法, 就可以了,不用再做其他事。*/ public class MD5Util { private final static String HEX_NUMS_STR = "0123456789ABCDEF"; private final static Integer SALT_LENGTH = 12; /** * 将16进制字符串转换成数组 * * @return byte[] * @author jacob * */ public static byte[] hexStringToByte(String hex) { /* len为什么是hex.length() / 2 ? * 首先,hex是一个字符串,里面的内容是像16进制那样的char数组 * 用2个16进制数字可以表示1个byte,所以要求得这些char[]可以转化成什么样的byte[],首先可以确定的就是长度为这个char[]的一半 */ int len = (hex.length() / 2); byte[] result = new byte[len]; char[] hexChars = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR .indexOf(hexChars[pos + 1])); } return result; } /** * 将数组转换成16进制字符串 * * @return String * @author jacob * * */ public static String byteToHexString(byte[] salt){ StringBuffer hexString = new StringBuffer(); for (int i = 0; i < salt.length; i++) { String hex = Integer.toHexString(salt[i] & 0xFF); if(hex.length() == 1){ hex = '0' + hex; } hexString.append(hex.toUpperCase()); } return hexString.toString(); } /** * 密码验证 * @param password 用户输入密码 * @param dbpassword 数据库保存的密码 * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static boolean validpassword(String password, String dbpassword) throws NoSuchAlgorithmException, UnsupportedEncodingException{ byte[] pwIndb = hexStringToByte(dbpassword); //定义salt byte[] salt = new byte[SALT_LENGTH]; System.arraycopy(pwIndb, 0, salt, 0, SALT_LENGTH); //创建消息摘要对象 MessageDigest md = MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); md.update(password.getBytes("UTF-8")); byte[] digest = md.digest(); //声明一个对象接收数据库中的口令消息摘要 byte[] digestIndb = new byte[pwIndb.length - SALT_LENGTH]; //获得数据库中口令的摘要 System.arraycopy(pwIndb, SALT_LENGTH, digestIndb, 0,digestIndb.length); //比较根据输入口令生成的消息摘要和数据库中的口令摘要是否相同 if(Arrays.equals(digest, digestIndb)){ //口令匹配相同 return true; }else{ return false; } } /** * 获得md5之后的16进制字符 * @param password 用户输入密码字符 * @return String md5加密后密码字符 * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String getEncryptedPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //拿到一个随机数组,作为盐 byte[] pwd = null; SecureRandom sc= new SecureRandom(); byte[] salt = new byte[SALT_LENGTH]; sc.nextBytes(salt); //声明摘要对象,并生成 MessageDigest md = MessageDigest.getInstance("MD5"); //计算MD5函数 md.update(salt); //password.getBytes("UTF-8")将输入密码变成byte数组,即将某个数装换成一个16进制数 md.update(password.getBytes("UTF-8")); //计算后获得字节数组,这就是那128位了即16个元素 byte[] digest = md.digest(); pwd = new byte[salt.length + digest.length]; System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); return byteToHexString(pwd); } } ```
CharSequence有关问题
从字面上看CharSequence与字符数组有一些联系,它们实际上有联系吗?CharSequence为一个接口,为什么其中变量并没有定义为public final,而是并没有定义访问权限,也就是默认的defult访问权限,而且在下面的方法中有一些没有方法体但是方法声明中却没有abstract关键字,另一些方法竟然有方法体,而且声明中竟然为public default,双层访问权限?CharSequence作用到底是什么,应该怎么使用?我是看到StringWriter中覆写Writer中的write(char[] cbuf,int off,int len)方法,在经过数组长度判断后调用本类中的,append(CharSeqence csq,int start,int off)方法后产生疑问的,传入的char数组却被Char Sequence接收,我写下CharSequence cs ={'a','b','c'};却编译出错。还有个append(String str,int off,int len)不知道那个write方法末尾是否实际上是调用的它。
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!)
XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与姓名填写在答题纸上。 1、 以下数据结构中不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 我的答案:C 4、 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段()。 A、 概要设计 B、详细设计 C、可行性分析 D、需求分析 我的答案:B 5、 下列关于栈的叙述中正确的是()。 A、 在栈中只能插入数据 B、在栈中只能删除数据 B、 栈是先进先出的线性表 D、栈是先进后出的线性表 我的答案:D 6、 下面不属于软件设计原则的是()。 A、 抽象 B、模块化 C、自底向上 D、信息隐蔽 我的答案:C 7、 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为()。 A、 N+1 B、N C、(N+1)/2 D、N/2 我的答案:C 8、 视图设计一般有3种设计次序,下列不属于视图设计的是()。 A、 自顶向下 B、由外向内 C、由内向外 D、自底向上 我的答案:C 9、下列有关数据库的描述,正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、数据库系统的三级模式分别为(级联)模式、内部级模式与外部级模式。 13、在最坏情况下,冒泡排序的时间复杂度为(N+1/2)。 14、在面向对象方法中,信息隐蔽是通过对象的(封装)性来实现的。 15、关系模型的数据操纵既是建立在关系上的数据操纵,一般有(插入)、增加、删除、和修改四种操作。 16、TIME()的返回值的数据类型是(String)类型。 17、编写SQL语句 1)、创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 我的答案: create table student( studentCardNo number(2) primary key, name char(10), age number(2), sex char(2) check(sex in (‘男’,’女’)), address varchar2(100), tel number(2) ) 2)、修改学生表的结构,添加一列信息,学历 我的答案: alter table student add(xueli varchar2(20)); 3)、修改学生表的结构,删除一列信息,家庭住址 我的答案: alter table student drop column address; 4)、向学生表添加如下信息: 学号 姓名 年龄 性别 联系电话 学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 我的答案: insert into student values(‘&1’,’&2’,’&3’); 一次一次添加 5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” 我的答案: update student set xueli=”大专” where tel like 11%; 6)删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 我的答案: delete student where name like C% or sex=”男”; 7)查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号显示出来 我的答案: select name,studentCardNo from student where age<22 and xueli=”大专”; 8)查询学生表的数据,查询所有信息,列出前25%的记录 我的答案: select top*0.25 from student; 9)查询出所有学生的姓名,性别,年龄降序排列 我的答案: select name,sex,age from student where age desc; 10)按照性别分组查询所有的平均年龄 我的答案: select avg(age) from student group by sex; 18、什么是存储过程?为什么存储过程要比单纯的SQL语句执行起来要快? 我的答案: 存储过程算是一种优化查询需要比单存SQL语句执行的要快 19、两张关联表,删除主表中已经在副表中没有的信息 我的答案 delete from fubiao a where a.fid not in(select id from zhubiao) 20、程序题: 用1、2、2、3、4、5这六个数字,用java或你熟悉的语言,打印出所有不同的排列,如:512234、412345等,要求:“4”不能再第三位,“3”与“5”不能相连。并将这些数据按从小到大输出。 我的答案 我的写的不好 没贴下 笔试的时候没写全 21、String 和 StringBuffer的区别 我的答案 String定长 StringBuffer 变长 22、&和&&的区别 我的答案 &短路与 &&逻辑与 网上答案: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(and)。 23、final,finally,finalize的区别 我的答案 Final静变量关键字,finally异常关键字,finalize 网上答案 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 24、数组有没有length()这个方法?String有没有length()这个方法? 我的答案: 数组没有length()这个方法,有length的属性。 String有length()这个方法。 25、是否可以继承String类? 我的答案: 不可以 解释的很乱 26、说出数据连接池的工作机制是什么? 我的答案: 反正解释的很乱我感觉 27、垃圾回收的优点和原理。并考虑2种回收机制。 我的答案: 动态回收 解释的很乱 网上答案: Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解, 它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念, 只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有 使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 28、你所知道的集合类都有哪些?区别?主要方法? 我的答案: Arraylist 非线性的、Vertor线性的 29、JSP的内置对象及方法。 我的答案: Page,exception,out,page content,application,request,reponse,session,config 30、页面间对象传递的方法。 我的答案: 那几个方法都写错了 31、你知道Request对象的主要方法有哪些? 32、J2EE是技术还是平台还是框架? 我的答案: J2EE是技术也是平台 网上答案: J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种(例如GBK编码类型)编码的字符串? Request encording(“GBK”) 34、j2ee常用的设计模式?说明工厂模式。 Gof23种设计模式 工厂模式:Factory 网上答案: Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。 然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。 当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 35、JSP四种会话跟踪技术 我的答案: Application cookie session 36、排序都有哪几种方法?请举例 冒泡 选择 快序 二分查找 网上答案: 排序的方法有:插入排序(直接插入排序、希尔排序), 交换排序(冒泡排序、快速排序), 选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 递归地使用快速排序方法对left 进行排序 递归地使用快速排序方法对right 进行排序 所得结果为l e f t + m i d d l e + r i g h t 37、关于模块间的设计原则? 规范要一样 38、项目过程一般是怎样的?你参加过几个项目开发?参加过的项目流程是怎样的?自己负责与人合作工作内容及自我评价? 从需求调研——设计开发——实施 参加过网站的实施 模板的制作 39、tomcat自动关闭常见原因? 我的答案: 现在没遇到过 40、如何设置TOMCAT内存和连接数? 我的答案: Tomcat群集 41、你如何理解Tomcat是什么? 我的答案: Tomcat是JSP Servlet 容器恰当的说 42、静态变量和实例变量的区别? 我的答案: 静态变量域用final修饰,每次都被调用 实例变量则不会 43、IE、FF下面CSS的解释区别 我的答案: 自己编的 44、web前端技术你了解哪些技术? 我的答案: JAVAScript,CSS,DIV,Ajax,Ajax框架,DWR,dojo,jguery 45、什么是报表?什么是报表控件,作用是什么?你了解哪些报表工具? 我的答案: 解释的很乱 46、你了解的那些统计图表类型? 我的答案: 自己编的 47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ------------------------------------------------------- 我答错的、 错在哪里? 没答上的帮忙解答下? 感激了 !
arraylist的增添覆盖问题 new Student()已放到循环内 还是覆盖前边的输入怎么解决
import java.util.Scanner; import java.util.ArrayList; public class Student{ static String sNo,sSex,sName; static int sAge,sJava; //构造方法初始化成员变量 Student(String sNo,String sSex,String sName,int sAge,int sJava){ this.sNo=sNo; this.sSex=sSex; this.sName=sName; this.sAge=sAge; this.sJava=sJava; } //创建get方法 static String getNo(){ return sNo; } static String getName(){ return sName; } static String getSex(){ return sSex; } static int getAge(){ return sAge; } static int getJava(){ return sJava; } //构造一个输出方法 public String toPrint(){ return "学号:"+sNo+" "+"名字:"+sName+" "+"性别:"+sSex+" "+"年龄:"+sAge+" "+"java成绩:"+sJava; } public static void main(String[] args){ ArrayList<Student> list=new ArrayList<Student>();//构造arraylist方法 Scanner input=new Scanner(System.in); for(int i=0;i<2;i++){//循环输入学生信息 System.out.println("请输入学号:"); String no=input.next(); System.out.println("请输入名字:"); String name=input.next(); System.out.println("请输入性别:"); String sex=input.next(); System.out.println("请输入年龄:"); int age=input.nextInt(); System.out.println("请输入java成绩(整数):"); int java=input.nextInt(); Student a=new Student(no,sex,name,age,java);//将信息录入Student构造方法 list.add(a);//增添信息 } int resultsMax=0,resultsMin=list.get(0).getJava();//声明两个变量得到最大、最小成绩 int max=0,min=0;//声明两个变量,存最大小值所在的数组索引 for(int j=0;j<list.size();j++){//使用arraylist size方法判断动态数组长度 System.out.println(list.get(j).toPrint()); if(list.get(j).getJava()>resultsMax){//判断java最大数据 resultsMax=list.get(j).getJava(); max=j; } if(list.get(j).getJava()<resultsMin){//判断java最小数据 resultsMin=list.get(j).getJava(); min=j; } } System.out.println("java成绩最高的学生信息:"+list.get(max).toPrint()); System.out.println("java成绩最低的学生信息:"+list.get(min).toPrint()); } }
各位大神,为啥我这个程序运行之后会乱码?怎么样才能不乱码?
代码运行之后成这样了 ![图片说明](https://img-ask.csdn.net/upload/201604/14/1460602344_472443.png) 下面是代码 package demo12.datademo; import java.io.DataOutputStream ; import java.io.File ; import java.io.FileOutputStream ; public class DataOutputStreamDemo{ public static void main(String args[]) throws Exception{ // 所有异常抛出 DataOutputStream dos = null ; // 声明数据输出流对象 File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径 dos = new DataOutputStream(new FileOutputStream(f)) ; // 实例化数据输出流对象 String names[] = {"衬衣","手套","围巾"} ; // 商品名称 float prices[] = {98.3f,30.3f,50.5f} ; // 商品价格 int nums[] = {3,2,1} ; // 商品数量 for(int i=0;i<names.length;i++){ // 循环输出 dos.writeChars(names[i]) ; // 写入字符串 dos.writeChar('\t') ; // 写入分隔符 dos.writeFloat(prices[i]) ; // 写入价格 dos.writeChar('\t') ; // 写入分隔符 dos.writeInt(nums[i]) ; // 写入数量 dos.writeChar('\n') ; // 换行 } dos.close() ; // 关闭输出流 } }; package demo12.datademo; import java.io.DataInputStream ; import java.io.File ; import java.io.FileInputStream ; public class DataInputStreamDemo{ public static void main(String args[]) throws Exception{ // 所有异常抛出 DataInputStream dis = null ; // 声明数据输入流对象 File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径 dis = new DataInputStream(new FileInputStream(f)) ; // 实例化数据输入流对象 String name = null ; // 接收名称 float price = 0.0f ; // 接收价格 int num = 0 ; // 接收数量 char temp[] = null ; // 接收商品名称 int len = 0 ; // 保存读取数据的个数 char c = 0 ; // '\u0000' try{ while(true){ temp = new char[200] ; // 开辟空间 len = 0 ; while((c=dis.readChar())!='\t'){ // 接收内容 temp[len] = c ; len ++ ; // 读取长度加1 } name = new String(temp,0,len) ; // 将字符数组变为String price = dis.readFloat() ; // 读取价格 dis.readChar() ; // 读取\t num = dis.readInt() ; // 读取int dis.readChar() ; // 读取\n System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ; } }catch(Exception e){} dis.close() ; } };
ext的弹出窗口如何布局?
ext渲染html通过div用viewport很好布局,我现在如何在ext的弹出窗口window里布局那,我在ext window里放了queryform和grid grid的布局一直搞不好,设置grid的height就没有列拉条。设置viewConfig : {forceFit : true}则数据显示不正确 [b]问题补充:[/b] 弹出子窗口,要在弹出一窗口如何扑获click事件 [b]问题补充:[/b] 我把代码贴出来: [code="java"] Ext.onReady(function() { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = 'side'; var inputPageSize = 8; function renderDescn(value, cellmeta, record, rowIndex, columnIndex, store) { var str = "<input type='button' id='update-btn' value='分组电文详细信息' class='x-btn-wrap x-btn' onclick='Info();'/>"; return str; } var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), { header : '电文组号', dataIndex : 'DESTINATION', sortable : true }, { header : '电文条数', dataIndex : 'CNT', sortable : true }, { header : '发送时间', dataIndex : 'SENTLOGTIME', sortable : true }, { header : '操作', dataIndex : 'SENTMESSAGEID', renderer : renderDescn }]); /** * 声明数据适配器,将数据源与列模型绑定 */ var MyRecord = Ext.data.Record.create([{ name : 'DESTINATION', mapping : 'DESTINATION' }, { name : 'SENTLOGTIME', mapping : 'SENTLOGTIME' }, { name : 'CNT', mapping : 'CNT' }]) var store = new Ext.data.Store({ proxy : new Ext.data.HttpProxy({ url : '../sentmessagegroup.do?command=list' }), reader : new Ext.data.JsonReader({ totalProperty : 'totalProperty', root : 'root' }, MyRecord) }); /** * 生成Bbar,用于分页显示 */ var bbar = new Ext.PagingToolbar({ pageSize : inputPageSize, store : store, displayInfo : true, displayMsg : '显示第{0}条到{1}条记录,一共{2}条', emptyMsg : '没有记录' }); /** * 声明一个Grid,列表显示信息 */ var grid = new Ext.grid.GridPanel({ el : 'grid', region : 'center', title : '发送分组详细信息', // height : 430, trackMouseOver : false, loadMask : { msg : '正在加载数据,请稍后.....' }, ds : store, cm : cm, sm : new Ext.grid.RowSelectionModel(), bbar : bbar, viewConfig : { forceFit : true } // buttons : [{ // text : '添加电文', // id : 'addbtn', // handler : function() { // addclick(); // } // }] }); window.Info = function() { var PageSize = 8; var selectRecord = grid.getSelectionModel().getSelected(); var data = selectRecord.get("DESTINATION"); //Ext.get("update").on("click", update); function desc(value, cellmeta, record, rowIndex, columnIndex, store) { var str = "<input type='button' id='update' value='详细信息' class='x-btn-wrap x-btn' onclick='update();'/>"; return str; } //Ext.get("update").on("click", update); var infocm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), { header : '序列号', dataIndex : 'SENTMESSAGEID', sortable : true }, { header : '电文插入时间', dataIndex : 'SENTLOGTIME', sortable : true }, { header : '电文号', dataIndex : 'MESSAGEID', sortable : true }, { header : '电文内容', dataIndex : 'BUFFERDATA', sortable : true }, { header : '终点代码', dataIndex : 'DESTINATION', sortable : true }, { header : '长度', dataIndex : 'LENGTH', sortable : true }, { header : '发送结果', dataIndex : 'SENDRESULT', sortable : true }, { header : '成功时间', dataIndex : 'PROCESSLOGTIME', sortable : true }, { header : '重发次数', dataIndex : 'RESENDNUMBER', sortable : true }, { header : '标注', dataIndex : 'MEMO', sortable : true }, { header : '操作', dataIndex : 'SENTMESSAGEID', renderer : desc }]); var infoRecord = Ext.data.Record.create([{ name : 'SENTMESSAGEID', mapping : 'SENTMESSAGEID' }, { name : 'SENTLOGTIME', mapping : 'SENTLOGTIME' }, { name : 'MESSAGEID', mapping : 'MESSAGEID' }, { name : 'BUFFERDATA', mapping : 'BUFFERDATA' }, { name : 'BUFFERCONTENT', mapping : 'BUFFERCONTENT' }, { name : 'DESTINATION', mapping : 'DESTINATION' }, { name : 'LENGTH', mapping : 'LENGTH' }, { name : 'SENDRESULT', mapping : 'SENDRESULT' }, { name : 'PROCESSLOGTIME', mapping : 'PROCESSLOGTIME' }, { name : 'RESENDNUMBER', mapping : 'RESENDNUMBER' }, { name : 'MEMO', mapping : 'MEMO' }]) var infostore = new Ext.data.Store({ proxy : new Ext.data.HttpProxy({ url : '../sentmessagegroup.do?command=grouplist' }), reader : new Ext.data.JsonReader({ totalProperty : 'totalProperty', root : 'root' }, infoRecord) }); infostore.baseParams = { destination : data }; var infobbar = new Ext.PagingToolbar({ pageSize : PageSize, store : infostore, displayInfo : true, displayMsg : '显示第{0}条到{1}条记录,一共{2}条', emptyMsg : '没有记录' }); var infogrid = new Ext.grid.GridPanel({ region : 'center', title : '发送电文详细信息', height : 210, trackMouseOver : false, loadMask : { msg : '正在加载数据,请稍后.....' }, ds : infostore, cm : infocm, sm : new Ext.grid.RowSelectionModel(), bbar : infobbar // viewConfig : { // forceFit : true // } // buttons : [{ // text : '添加电文', // id : 'addbtn', // handler : function() { // addclick(); // } // }] }); function update() { alert("update start"); var infowin; if (!infowin) { var selectRecord = infogrid.getSelectionModel().getSelected(); var infofrom = new Ext.form.FormPanel({ labelAlign : 'top', buttonAlign : 'right', title : '电文详细信息', bodyStyle : 'padding:5px', height : 415, width : 650, frame : true, url : '../sentmessage.do?command=again', items : [{ layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '序列号', name : 'SENTMESSAGEID', readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '电文插入时间', name : 'SENTLOGTIME', minLength : 1, maxLength : 25, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '电文号', name : 'MESSAGEID', readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '发送方主机代号', name : 'DESTINATION', minLength : 0, maxLength : 17, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '长度', name : 'LENGTH', readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', xtype : 'textfield', fieldLabel : '处理标志', name : 'SENDRESULT', minLength : 0, maxLength : 17, // readOnly : true, // disabled:true, anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '应用处理时间', name : 'PROCESSLOGTIME', minLength : 1, maxLength : 17, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '重发次数', name : 'RESENDNUMBER', minLength : 1, maxLength : 17, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .93, layout : 'form', border : false, items : [{ xtype : 'textarea', fieldLabel : '电文内容', name : 'BUFFERCONTENT', minLength : 1, maxLength : 5000, anchor : '100%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .93, layout : 'form', border : false, items : [{ xtype : 'textarea', fieldLabel : '标注', name : 'MEMO', minLength : 1, maxLength : 500, anchor : '100%' }] }] }], buttons : [{ text : '手动重发', handler : function() { from.getForm().submit({ success : function(form, action) { var json = action.response.responseText; var check = eval("(" + json + ")"); if (check.update == true) { Ext.MessageBox.alert('信息', '更发成功,点击返回列表页面'); grid.render(); } infostore.load({ params : { start : 0, limit : inputPageSize } }); win.close(); }, failure : function(form, action) { var json = action.response.responseText; var check = eval("(" + json + ")"); if (check.check == false) { Ext.MessageBox .alert('错误', '抱歉,该用户权限不够'); } else { Ext.MessageBox.alert('信息', '添加失败,请与管理员联系!'); } } }); } }] } ); infowin = new Ext.Window({ title : 'Window', closable : true, width : 660, height : 435, // border:false, plain : true, draggable : true, collapsible : true, closeAction : 'hide', items : [infofrom] }); } // from.findField("BUFFERDATA").setValue("blob test"); //Ext.get('update-btn').get('update').on("click", update); infowin.show(Ext.get('update')); /** * form加载事件 */ // from.form.findField("BUFFERDATA").setValue(blob.bufferdata); infofrom.getForm().loadRecord(selectRecord); // from.form.findField("BUFFERDATA").setValue(blob.bufferdata); }; var queryform = new Ext.FormPanel({ labelAlign : 'left', region : 'north', title : '电文查询', buttonAlign : 'right', bodyStyle : 'padding:5px', // width : 300, height : 150, frame : true, labelWidth : 80, viewConfig : { forceFit : true }, items : [{ layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ // 用户编号 xtype : 'textfield', fieldLabel : '电文号', name : 'messageid', anchor : '85%' }, { // 用户编号 xtype : 'datefield', fieldLabel : '开始时间', name : 'startdate', format : 'Y-m-d', anchor : '85%' } ] }, { columnWidth : .5, layout : 'form', border : false, items : [{ // 用户名 xtype : 'textfield', fieldLabel : '发送结果', name : 'sendresult', anchor : '85%' }, { // 用户名 xtype : 'datefield', fieldLabel : '结束时间', name : 'enddate', format : 'Y-m-d', anchor : '85%' }] }] }], buttons : [ { text : '查询', handler : function() { var messageid = queryform.form.findField("messageid") .getValue(); // alert("messageid:"+messageid); var sendresult = queryform.form.findField("sendresult") .getValue(); // alert("destination:"+destination); var start = queryform.form.findField("startdate") .getValue(); var startdate; // alert("start:"+start); if (start != null && start != "") { startdate = start.format("Y-m-d"); } // alert("startdate:"+startdate); var end = queryform.form.findField("enddate").getValue(); var enddate; // alert("end:"+end); if (end != null && end != "") { enddate = end.format("Y-m-d"); } // alert("enddate:"+enddate); infostore.baseParams = { messageid : messageid, // destination : data, startdate : startdate, sendresult : sendresult, enddate : enddate }; infostore.reload({ params : { start : 0, limit : inputPageSize } }); } }, { text : '重置', handler : function() { queryform.form.reset(); } }] }) var win = new Ext.Window({ title : 'infoWindow', closable : true, width : 660, height : 500, // border:false, plain : true, draggable : true, collapsible : true, closeAction : 'hide', layout : 'border', items : [queryform, infogrid] }) // infogrid.render(); infostore.load({ params : { start : 0, limit : PageSize } }) // infogrid.render(); win.show(Ext.get('update-btn')); } // =================================表单提交======================================== /** * 为Grid的添加按钮编写单击事件 */ function addclick() { var win; if (!win) { var from = new Ext.form.FormPanel({ labelAlign : 'top', buttonAlign : 'right', title : '添加发送电文信息', bodyStyle : 'padding:5px', height : 275, width : 650, frame : true, autoScroll : true, url : '../sentmessage.do?command=add', items : [{ layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '序列号', name : 'MAPPINGMESSAGEID', anchor : '85%' }, { xtype : 'textfield', fieldLabel : '电文号', name : 'MESSAGEID', anchor : '85%' }, { xtype : 'textfield', fieldLabel : '长度', name : 'LENGTH', anchor : '85%' }, { xtype : 'textfield', fieldLabel : '重发次数', name : 'RESENDNUMBER', minLength : 1, maxLength : 17, anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '电文方向', name : 'DIRECTION', minLength : 1, maxLength : 17, anchor : '85%' }, { xtype : 'textfield', fieldLabel : '主机号', name : 'HOSTDC', minLength : 0, maxLength : 17, anchor : '85%' }, { xtype : 'textfield', fieldLabel : '电文组号', name : 'MESSAGEGROUPID', minLength : 0, maxLength : 17, anchor : '85%' }] }] }], buttons : [{ text : '提交', handler : function() { if (from.form.isValid()) { from.getForm().submit({ success : function() { Ext.MessageBox.alert('信息', '添加成功,点击返回列表页面'); grid.render(); store.load({ params : { start : 0, limit : inputPageSize } }); win.close(); }, failure : function() { Ext.MessageBox.alert('信息', '添加失败,请与管理员联系!'); } }); } } }, { text : '重置', handler : function() { from.getForm().reset(); } }] }); /** * 声明一个window,包装FormPanel */ win = new Ext.Window({ title : 'InfoWindow', closable : true, width : 660, height : 300, // border:false, plain : true, draggable : true, collapsible : true, closeAction : 'hide', items : [from] }); } win.show(Ext.get('addbtn')); }; window.delInfo = function() { var sm = grid.getSelectionModel(); var count = sm.getCount(); if (count == 0) { Ext.MessageBox.alert('信息', '您没有勾选任何记录!'); } else { Ext.MessageBox.confirm('Message', '确定要删除?', function(btn) { if (btn == 'yes') { var record = sm.getSelected(); var str = record.get('MAPPINGMESSAGEID'); Ext.Ajax.request({ url : '../sentmessage.do?command=delete', params : { MAPPINGMESSAGEID : str }, success : function() { Ext.MessageBox.alert('信息', '删除成功'); store.reload(); }, failure : function() { Ext.MessageBox.alert('错误', '请与后台服务人员联系'); }, timeout : 30000, headers : { 'my-header' : 'foo' } }); } }); } }; window.updateInfo = function() { alert("parent upadateinfo"); var win; if (!win) { var selectRecode = grid.getSelectionModel().getSelected(); var from = new Ext.form.FormPanel({ labelAlign : 'top', buttonAlign : 'right', title : '电文详细信息', bodyStyle : 'padding:5px', height : 415, width : 650, frame : true, url : '../sentmessage.do?command=again', items : [{ layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '序列号', name : 'SENTMESSAGEID', readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '电文插入时间', name : 'SENTLOGTIME', minLength : 1, maxLength : 25, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '电文号', name : 'MESSAGEID', readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '发送方主机代号', name : 'DESTINATION', minLength : 0, maxLength : 17, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '长度', name : 'LENGTH', readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', xtype : 'textfield', fieldLabel : '处理标志', name : 'SENDRESULT', minLength : 0, maxLength : 17, // readOnly : true, // disabled:true, anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '应用处理时间', name : 'PROCESSLOGTIME', minLength : 1, maxLength : 17, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }, { columnWidth : .5, layout : 'form', border : false, items : [{ xtype : 'textfield', fieldLabel : '重发次数', name : 'RESENDNUMBER', minLength : 1, maxLength : 17, readOnly : true, style : "background: #B9B9C3;", anchor : '85%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .93, layout : 'form', border : false, items : [{ xtype : 'textarea', fieldLabel : '电文内容', name : 'BUFFERCONTENT', minLength : 1, maxLength : 5000, anchor : '100%' }] }] }, { layout : 'column', border : false, items : [{ columnWidth : .93, layout : 'form', border : false, items : [{ xtype : 'textarea', fieldLabel : '标注', name : 'MEMO', minLength : 1, maxLength : 500, anchor : '100%' }] }] }], buttons : [{ text : '手动重发', handler : function() { from.getForm().submit({ success : function(form, action) { var json = action.response.responseText; var check = eval("(" + json + ")"); if (check.update == true) { Ext.MessageBox.alert('信息', '更发成功,点击返回列表页面'); grid.render(); } store.load({ params : { start : 0, limit : inputPageSize } }); win.close(); }, failure : function(form, action) { var json = action.response.responseText; var check = eval("(" + json + ")"); if (check.check == false) { Ext.MessageBox.alert('错误', '抱歉,该用户权限不够'); } else { Ext.MessageBox.alert('信息', '添加失败,请与管理员联系!'); } } }); } }] } ); win = new Ext.Window({ title : 'Window', closable : true, width : 660, height : 435, // border:false, plain : true, draggable : true, collapsible : true, closeAction : 'hide', items : [from] }); } // from.findField("BUFFERDATA").setValue("blob test"); win.show(Ext.get('update-btn')); /** * form加载事件 */ // from.form.findField("BUFFERDATA").setValue(blob.bufferdata); from.getForm().loadRecord(selectRecode); // from.form.findField("BUFFERDATA").setValue(blob.bufferdata); }; // =================================渲染呈现======================================== /** * 渲染呈现Grid,Store初始化 */ var queryform = new Ext.FormPanel({ labelAlign : 'left', region : 'north', title : '电文查询', buttonAlign : 'right', bodyStyle : 'padding:5px', width : 300, height : 150, frame : true, labelWidth : 80, items : [{ layout : 'column', border : false, items : [{ columnWidth : .5, layout : 'form', border : false, items : [{ // 用户编号 xtype : 'textfield', fieldLabel : '电文号', name : 'messageid', anchor : '85%' }, { // 用户编号 xtype : 'datefield', fieldLabel : '开始时间', name : 'startdate', format : 'Y-m-d', anchor : '85%' } ] }, { columnWidth : .5, layout : 'form', border : false, items : [{ // 用户名 xtype : 'textfield', fieldLabel : '终点代码', name : 'destination', anchor : '85%' }, { // 用户名 xtype : 'datefield', fieldLabel : '结束时间', name : 'enddate', format : 'Y-m-d', anchor : '85%' }] }] }], buttons : [ { text : '查询', handler : function() { var messageid = queryform.form.findField("messageid") .getValue(); // alert("messageid:"+messageid); var destination = queryform.form.findField("destination") .getValue(); // alert("destination:"+destination); var start = queryform.form.findField("startdate").getValue(); var startdate; // alert("start:"+start); if (start != null && start != "") { startdate = start.format("Y-m-d"); } // alert("startdate:"+startdate); var end = queryform.form.findField("enddate").getValue(); var enddate; // alert("end:"+end); if (end != null && end != "") { enddate = end.format("Y-m-d"); } // alert("enddate:"+enddate); store.baseParams = { messageid : messageid, destination : destination, startdate : startdate, enddate : enddate }; store.reload({ params : { start : 0, limit : inputPageSize } }); } }, { text : '重置', handler : function() { queryform.form.reset(); } }] }) var viewport = new Ext.Viewport({ layout : 'border', items : [queryform, grid] }) grid.render(); store.load({ params : { start : 0, limit : inputPageSize } }); }) Ext.override(Ext.menu.DateMenu, { render : function() { Ext.menu.DateMenu.superclass.render.call(this); if (Ext.isGecko) { this.picker.el.dom.childNodes[0].style.width = '178px'; this.picker.el.dom.style.width = '178px'; } } }); [/code] 点击主页面的分组详细信息,跳出一个子窗口,显示该组的详细纪录分页及查询,我现在想要的是在点击子窗口的的详细信息在跳出一个窗口,显示该条纪录的详细信息 [b]问题补充:[/b] to yourgame:我截图贴上来你就明白了,图1是主窗口点击上面的分组电文详细信息,就跳出图2子窗口,我现在就想点击图2的详细信息在跳出一个子窗口图3。图2是渲染到图1的一个div块的id,图2在跳出一个窗口3就没有可渲染的地方,因为图2是一个ext window不包含任何html,我的问题就在这里。 [b]问题补充:[/b] to yourgame:你还是没理解我要啥,你这只实现我做的工作,我的意思主页面跳出一个ext window,点击这个ext window上的grid在跳出一个ext window [b]问题补充:[/b] to yourname:子窗口可以跳出,但是值代不出来,第3个窗口的列信息和主窗口是不一样的
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问